2015-10-19 36 views
2

我正在嘗試爲我們的其中一個工具編寫bash_completion腳本。 看着apt-get和chkconfig腳本尋求幫助。 基本上我想要做的是根據第一個值獲取不同的選項選擇。 值可以有多個選項。基於第一個值的不同選項bash完成

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 

我得到一個不同的選擇的兩個部署和銷燬選擇。 但我只能使用一個--選項。 當我再次嘗試使用--時,沒有任何反應,沒有--,我從opts獲得列表。

這可能是一件容易的事,但目前我在這裏找不到錯誤。 我也有之前試過沒有$cword,相同的結果

+0

你可以看看'git'如何完成不同的子命令 –

回答

1

相反的prev,你只是想每次都來看看第一個參數的值:

case ${COMP_WORDS[1]} of 

就有點tricker如果你允許「常規」選項放在子命令之前,但通常情況下,您希望查看第一個非選項參數,而不一定是前一個參數。

+0

如果我正確地理解了這一點,我的初始代碼'prev'將是'--'選項之一,並且案例循環將不再適合? – derchris

相關問題