带引号的完整命令选项

时间:2015-04-19 17:47:05

标签: bash bash-completion

我正在尝试编写一个Bash完成函数来完成像--param1=value1这样的长命令行选项。如果未引用value1,这样可以正常工作。但在许多情况下,value1需要引用,例如--param1='Hello world'。在这种情况下,Bash完成停止工作。例如:

_myprog()
{
    local cur="${COMP_WORDS[$COMP_CWORD]}"
    local words=(--param1 --param2)
    COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") )
}

complete -F _myprog myprog

如果我提供此source script.sh,然后输入myprog --param1='hello' <tab><tab>则不会发生任何事情。如果我在双短划线之前开始引用,例如myprog '--param1=hello' <tab><tab> ..

,它可以正常工作

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

可以使用COMP_LINE代替COMP_WORDS

来完成此操作
_myprog()
{
    local comp_line=( $COMP_LINE )
    local cur
    if [[ ${COMP_LINE: -1} == ' ' ]] ; then
        cur=""
    else
        cur="${comp_line[@]: -1}"
    fi
    local words=(--param1 --param2)
    COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") )
}