我正在嘗試編寫一個Bash完成腳本,用於在--option
或--param=value
表單上可以使用長選項的命令。如果用戶已經在命令行中輸入了一個選項,那麼該選項應該從完成列表中排除(假設只在命令行上指定一個給定的選項纔有意義)。帶等號的完整命令選項
這是第一次嘗試:
_myprog()
{
local cur="${COMP_WORDS[$COMP_CWORD]}"
local words=(--help --param1= --param-state --param2=)
_exclude_cmd_line_opts
COMPREPLY=($(compgen -W "${words[*]}" -- "$cur"))
}
complete -F _myprog myprog
_exclude_cmd_line_opts() {
local len=$(($COMP_CWORD - 1))
local i
for i in "${COMP_WORDS[@]:1:$len}" ; do
[[ $i == --* ]] && words=("${words[@]/$i}")
done
}
如果source這個腳本source script.sh
然後寫:
$ myprog --param1= <tab><tab>
我碰到下面的完成列表:
= --help --param2= --param-state
所以它的工作原理幾乎除了我得到一個虛假'='
登錄完成lis任何建議?
在'local words'賦值中將'--param1 ='改爲'--param1'。 – Barmar
是的,但我想避免讓用戶在可能的情況下輸入'='符號。 –
哦,你在開頭討論'=',而不是在'--param2之後的'=' '。我以前沒有看到過。 – Barmar