使用基于第一个值的不同选项完成bash完成

时间:2015-10-19 14:51:59

标签: bash bash-completion

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

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

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

这是我到目前为止所得到的:

 _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

我为deploy和destroy提供了不同的选项选择。 但我只能使用一个--选项。 当我再次尝试使用--时,没有任何反应,如果没有--,我会从opts中获取列表。

这可能很容易,但我现在无法在这里找到错误。 我也试过没有$cword之前,同样的结果

1 个答案:

答案 0 :(得分:1)

而不是prev,你只想每次都看一下第一个参数的值:

case ${COMP_WORDS[1]} of

如果你允许“常规”选项在子命令之前,它会有点小问题,但一般来说你要查看第一个非选项参数,不一定是前一个参数。