Bash完成:允许标记一次

Bash完成:允许标记一次,bash,bash-completion,Bash,Bash Completion,我有一个基本完整的功能: _my_complete () { local cur prev opts opts2; COMPREPLY=(); cur="${COMP_WORDS[COMP_CWORD]}"; prev="${COMP_WORDS[COMP_CWORD-1]}"; opts="foo bar"; opts2="-f -s"; case ${COMP_CWORD} in 1) CO

我有一个基本完整的功能:

_my_complete () 
{ 
    local cur prev opts opts2;
    COMPREPLY=();
    cur="${COMP_WORDS[COMP_CWORD]}";
    prev="${COMP_WORDS[COMP_CWORD-1]}";
    opts="foo bar";
    opts2="-f -s";
    case ${COMP_CWORD} in 
        1)
            COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
        ;;
        2 | 4)
            COMPREPLY=($(compgen -W "${opts2}" -- ${cur}))
        ;;
    esac
}
如何将完成限制为在命令行中只接受一次-f或-s


谢谢

问题解决了。受@whjm评论和本书启发


正如您所知,所有参数都在
${COMP_WORDS[@]}
中,因此您可以简单地检查
-f
-s
是否已在数组中。是的,但是如何以及在何处检查并编辑
opts2
?有更简单的方法来获取
cur
prev
。只需编写
cur=$2
prev=$3
。而
$1
是命令本身。几个网站的例子都提出了复杂的方法。所以我坚持这样做。
$1..3
对我来说总是很好的。如果你非常清楚
${COMP_WORDS[@]}
的区别,那么你就知道什么时候使用它了。对我来说,足够好就足够了
_my_complete() {
        local cur prev opts opts2 subopts ;
        COMPREPLY=();
        cur="${COMP_WORDS[COMP_CWORD]}";
        prev="${COMP_WORDS[COMP_CWORD-1]}";
        opts="foo bar";
        opts2="-f -s";
        subopts=();

        for i in ${opts2}
        do
                for j in "${COMP_WORDS[@]}"
                do
                        if [[ "$i" == "$j" ]] 
                        then
                                continue 2
                        fi
                done
                subopts+=("$i")
        done  

        case ${COMP_CWORD} in
            1)
                    COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
                    ;;
            2|4)
                    COMPREPLY=($(compgen -W "${subopts[*]}" -- ${cur}))
                    ;;
        esac
}