最近在完成一个由linux shell脚本编写的工具时,发现在实现多个功能时,冗长的多个参数不仅难记而且大小写混杂,虽然“悉心”地写了完备的'-h'帮助文档,但是为了实现其中一个功能,仍然需要输入多个冗长的字符串来定位某个大选项下的小选项所对应的功能。
在 linux shell 下本身有着体验极佳的命令补全功能,即[Tab][Tab]
。现通过自定义该程序的命令补全脚本实现命令补全。
[root@localhost ~]# help complete
complete: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
重点说明
执行shell 函数,函数中生成COMPREPLY作为候选的补全结果
用来筛选生成匹配单词的候选补全结果
[root@localhost ~]# help compgen
compgen: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
重点说明:
Parameter | description |
---|---|
-W wordlist | 分割 wordlist 中的单词,生成候选补全列表 |
用于修改补全命令设置,这个命令必须在补全函数中使用,否则会报错。
[root@localhost ~]# help compopt
compopt: compopt [-o|+o option] [-DE] [name ...]
重点说明:
Parameter | description |
---|---|
+o option | 启用 option 配置 |
-o option | 弃用 option 配置 |
除了上面三个命令外,Bash还有几个内置变量来辅助补全功能,如下:
variable | description |
---|---|
COMP_WORDS | 类型为数组,存放当前命令行中输入的所有单词 |
COMP_CWORD | 类型为整数,当前输入的单词在COMP_WORDS中的索引 |
COMPREPLY | 类型为数组,候选的补全结果 |
COMP_WORDBREAKS | 类型为字符串,表示单词之间的分隔符 |
COMP_LINE | 类型为字符串,表示当前的命令行输入字符 |
COMP_POINT | 类型为整数,表示光标在当前命令行的哪个位置 |
注:本示例只针对实际应用场景做了简单实现,做个思路引子。更多强大功能请自行研究( • ̀ω•́ )✧
complete_tool.sh :
_service_tool()
{ COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]}
local cmd=${COMP_WORDS[COMP_CWORD-1]} case $cmd in
'./odm_tools.sh')
COMPREPLY=( $(compgen -W '--FirmwareUpgrade --Diagnose --ServerConfigCheck' -- $cur ) )
;;
'--FirmwareUpgrade')
COMPREPLY=( $(compgen -W '--AfterReplaceMotherBoard --BiosUpgrade --BmcUpgrade --NicUpgrade --RaidHbaUpgrade --PsuUpgrade' -- $cur ) )
;;
'--Diagnose')
COMPREPLY=( $(compgen -W '--FastTestForAllHardWare --CpuFastTest --MemoryFastTest --RaidHbaFastTest --NicFashTest --BmcFastTest --MemoryFullTest --CpuFullTest --AllLogCollect' -- $cur ) )
;;
'--ServerConfigCheck')
COMPREPLY=( $(compgen -W '--GetALLInfo --GetCpuInfo --GetMemoryInfo --GetHardDiskInfo --GetRaidHbaInfo --GetNicInfo --GetPsuInfo' -- $cur ) )
;;
esac
return 0
}
complete -F _service_tool ./odm_tools.sh
Before:
[root@localhost Service]# ./odm_tools.sh [Tab][Tab]
ChangeLog files/ mkpackage.sh odm_tools.sh complete_tool.sh
导入补全脚本:
[root@localhost Service]# source complete_tool.sh
[root@localhost Service]#
再次尝试
[root@localhost Service]# ./odm_tools.sh -- [Tab][Tab]
--Diagnose --FirmwareUpgrade --ServerConfigCheck
[root@localhost Service]# ./odm_tools.sh --ServerConfigCheck --Get [Tab][Tab]
--GetALLInfo --GetCpuInfo --GetHardDiskInfo --GetMemoryInfo --GetNicInfo --GetPsuInfo --GetRaidHbaInfo
可将编写好的脚本在用户根目录.bash_profile
中进行调用,亦可放于/etc/bash_completion.d/
下,这样在下次登录终端时即可自动source
自动补全脚本。
祝大家元旦快乐!
本文分享自 WriteSimpleDemo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!