bash 根据第一个值使用不同的选项完成

bash completion with different options based on first value

我目前正在尝试为我们的一种工具编写 bash_completion 脚本。 正在查看 apt-get 和 chkconfig 脚本以寻求帮助。 基本上我想要做的是根据第一个值获得不同的选项选择。 一个值可以有多个选项。

command <value1> <--option1> <--option2> ...
command <value2> <--option3> <--option4> ...

查看 apt-get 脚本,它将 return 任何第一个值的相同选项列表。 所以这不是我需要的。

这是我目前得到的:

 _supdeploy()
{
    local cur prev opts cword
    _init_completion || return

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="deploy destroy supported list fulllist status fullstatus getip shutdown powerOff powerOn"

    case "${prev}" in
        deploy)
           if [[ "$cur" == -* ]]; then
               if [[ $cword -eq 2 || $cword -eq 3 || $cword -eq 4 ]]; then
                   COMPREPLY=( $( compgen -W '--hostname --os --version' -- "$cur" ) )
               fi
           fi
           return 0
           ;;
        destroy)
            if [[ "$cur" == -* ]]; then
               COMPREPLY=( $( compgen -W '--name --silent' -- "$cur" ) )
            fi
            return 0
            ;;
        *)
            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
            return 0
            ;;
    esac

} &&
complete -F _supdeploy supdeploy

我有不同的部署和销毁选项选择。 但是我只能使用一个 -- 选项。 当我再次尝试使用 -- 时,没有任何反应,没有 -- 我从 opts.

获得列表

这可能是一些简单的事情,但我暂时找不到错误。 我也试过没有 $cword 之前,同样的结果

而不是prev,您只想每次查看第一个参数的值:

case ${COMP_WORDS[1]} of

如果允许 "general" 选项在子命令之前,它会变得有点诡计,但通常您希望查看第一个非选项参数,而不一定是前一个参数。