我有以下工作bash_completion代码
_supdeploy()
{
local cur prev opts cword
_init_completion || return
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
first="${COMP_WORDS[1]}"
opts="option1 option2 --help"
case "${first}" in
option1)
if [[ "$cur" == * ]]; then
COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
fi
return 0
;;
option2)
if [[ "$cur" == * ]]; then
COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
fi
return 0
;;
*)
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
;;
esac
} &&
complete -F _supdeploy supdeploy
当我选中时,我首先得到opts
的列表,如果我使用其中一个选项,再次按Tab键,我会得到这些选项的arg列表。
我要做的是预先填充其中一些参数,这些参数具有分配给它们的值以及可供选择的列表。
我看到的所有例子都是从顶级使用这些例子,比如我的选择中的opts,但我想在第二级使用它。
我已经尝试在case循环中实现第二个if
,并检查例如$cur
是否为arg之一。
但它从未奏效,仍然只是在标签上打印完整列表。
答案 0 :(得分:0)
如果您想在--arg1
案例中列出option1
的可能选项,可以检查上一个字(prev="{COMP_WORDS[COMP_CWORD-1]}"
)是否等于--arg1
:
case "$first" in
option1)
case "$prev" in
--arg1)
COMPREPLY=( $( compgen -W 'A Ba Bb C' -- "$cur" ) )
return 0
;;
--arg2)
COMPREPLY=( $( compgen -W '11 12 2 3' -- "$cur" ) )
return 0
;;
*)
COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
return 0
;;
esac
;;
option2)
如果检查前一个单词不够灵活,您可以实现更复杂的逻辑。从手册页:
COMP_WORDS An array variable (see Arrays below) consisting of the individ- ual words in the current command line. The line is split into words as readline would split it, using COMP_WORDBREAKS as described above. This variable is available only in shell func- tions invoked by the programmable completion facilities (see Programmable Completion below).