给自己的脚本或工具添加自动补全参数选项的功能

为了完成这个需求,我们首先需要了解两个命令(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语句的同学就足够可以理解命令参数自动补齐的原理,大家可以根据自己的需求,去定制脚本工具的命令补齐功能了
如果对你有帮助,帮忙点个赞,非常感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值