为了完成这个需求,我们首先需要了解两个命令(compgen | complete)和三个系统参数(COMP_CWORD | COMP_WORDS | COMPREPLY)
1、先介绍一下上面的三个系统参数
比如执行一条命令:mycmd opt1 opt2 opt3
COMP_WORDS 是由上面命令中的元素组成的字符串数组,即COMP_WORDS=(mycmd opt1 opt2 opt3) #shell中数组由()包裹,元素之间用空格隔开
COMP_CWORD 是该数组的索引,在执行上面的命令时,当mycmd输入完毕此时COMP_CWORD的值为1,依次类推
COMPREPLY 这个参数就是当我们按Tab键时自动补齐的提示选项,它是一个数组类型的变量
2、compgen命令
示例:compgen -W “aa ab bb cc” – “a”
表示从"aa ab bb cc" 匹配出以“a”开头的单词
这条命令的返回结果就是 “aa ab”。
3、complete命令
首先写一个shell脚本vi test.sh
function test_comp(){
case $COMP_CWORD in
1)
COMPREPLY=($(compgen -W "aaa bbc ccc" -- ${COMP_WORDS[COMP_CWORD]}))
2)
COMPREPLY=($(compgen -W "a1 b2" -- ${COMP_WORDS[COMP_CWORD]}))
}
esac
示例:
source test.sh
complete -F test_comp mycmd
test_comp 是脚本test.sh的自定义方法,mycmd是我们自己写的脚本工具
现在就可以在执行我们的工具脚本mycmd时通过Tab键来提示和补齐它的参数选项了
mycmd [Tab] #输入命令后双击Tab键,会提示接下来要输入的自命令或参数选项
aaa bbb ccc
#输入命令,并输入a,再按Tab键,会自动补齐,然后双击Tab键又会显示aaa后面要跟的选项
mycmd aaa [Tab]
a1 b1
4、上面的例子比较简单,重点用来说明相关系统参数和命令的用法。下面来说明一下稍微复杂一点的情况,接着上面的例子来说,比如aaa、bbb、ccc是mycmd的是三个子命令,他们分别后面接a1 b1选项、b1选项和不接参数选项,这样的话我们需要改一下上面的test.sh脚本了,示例如下:
function test_comp(){
case $COMP_CWORD in
1)
COMPREPLY=($(compgen -W "aaa bbc ccc" -- ${COMP_WORDS[COMP_CWORD]}))
2)
if [[ ${COMP_WORDS[1]} == "aaa" ]];then
COMPREPLY=($(compgen -W "a1 b1" -- ${COMP_WORDS[COMP_CWORD]}))
fi
if [[ ${COMP_WORDS[1]} == "bbb" ]];then
COMPREPLY=($(compgen -W "b1" -- ${COMP_WORDS[COMP_CWORD]}))
fi
esac
}
再次执行下面的命令
source test.sh
complete -F test_comp mycmd
现在再来输入命令然后按Tab进行测试
mycmd [Tab] #输入命令后双击Tab键,会提示接下来要输入的自命令或参数选项
aaa bbb ccc
#输入命令,并输入a,再按Tab键,会自动补齐,然后双击Tab键又会显示aaa后面要跟的选项a1 b1
mycmd aaa [Tab]
a1 b1
#输入命令和子命令bbb,再按Tab键,可用选项b1会自动补齐,因为只有它一个可用选项
mycmd bbb b1
#输入命令和子命令ccc,再按Tab键,不会再有可用选项提示
mycmd ccc [Tab]
到此我认为,只要稍微熟悉shell语句的同学就足够可以理解命令参数自动补齐的原理,大家可以根据自己的需求,去定制脚本工具的命令补齐功能了
如果对你有帮助,帮忙点个赞,非常感谢