linux shell中的命令自动补全(compgen complete)与 命令行参数解析
linux shell中的命令自動(dòng)補(bǔ)全(compgen complete)與 命令行參數(shù)解析
標(biāo)簽: shell腳本 2013-12-31 21:56 6661人閱讀 評(píng)論(6) 收藏 舉報(bào) 分類: linux shell(1)版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
很多時(shí)候,當(dāng)我們寫一個(gè)腳本時(shí),我們總會(huì)提供一些可選的命令選項(xiàng)。當(dāng)可選項(xiàng)比較多的時(shí)候,比如git, 如果能夠提供命令自動(dòng)補(bǔ)全,無疑是錦上添花的事。而且個(gè)人認(rèn)為,這種方式,比采用將命令做成選擇菜單要更好一些。
假設(shè)我們現(xiàn)在這樣一個(gè)腳本,腳本執(zhí)行命令時(shí)bsu, ?類似git,腳本有兩個(gè)一級(jí)主命令pushbaseline, createrepo,然后這兩個(gè)一級(jí)主命令下還有若干選項(xiàng)
pushbaseline ?--qcom ?--mtk ?--name=(NX01, NX02) ? ? #要求 ?--qcom --mtk不能同時(shí)出現(xiàn),- -name=xxx可以與前面任意一個(gè)選項(xiàng)同時(shí)出現(xiàn)
createrepo ? --git ?--repo ?--name=xxx ?--auth=(W, R, RW) # 同上,這里--git, --repo不能同時(shí)出現(xiàn)。 后面兩個(gè)選項(xiàng)隨意
正式行動(dòng)之前我們做一個(gè)簡(jiǎn)單的需求分析,正所謂不做需求分析就干活,“加班沒日夜, 累死也枉然”
以pushbaseline為例,這里要求--qcom --mtk不能同時(shí)出現(xiàn),如果直接在腳本中實(shí)現(xiàn),就要判斷之前輸入中有沒有輸入--qcom,如果有輸入,就不能再把--mtk作為命令自動(dòng)補(bǔ)全的候選者。這種邏輯很復(fù)雜,對(duì)shell腳本不熟的人,只能望洋興嘆——“呵呵”。
事實(shí)上,從實(shí)際情況來看的話,為什么不能同時(shí)出現(xiàn),因?yàn)樗鼈兌紝儆谀硞€(gè)屬相的描述,所以這里簡(jiǎn)單的改為--platfrom=(qcom, mtk),問題就巧妙解決了。
下面開始寫腳本,上面將--qcom --mtk 改編為--platform=(qcom,mtk),缺少了簡(jiǎn)單選項(xiàng),為此再額外加一個(gè) --multi
自動(dòng)補(bǔ)全,linux提供了兩個(gè)重要命令 compgen, complete
命令:compgen?-W "aa ab bb cc" -- “a” ??
表示從"aa ab bb cc" ?匹配出以“a”開頭的單詞
這條命令的返回結(jié)果就是 “aa ab”。?
命令:complete -F ?__cmd_HUB ?bsu
表示當(dāng)執(zhí)行bsu命令時(shí),自動(dòng)補(bǔ)全的候選單詞由函數(shù)__cmd_HUB計(jì)算得到,具體的承載容器是變量COMPREPLY
特別說明一下,像這樣的complete -F XXX ? ./test.sh ?也是合法的。如果XXX的計(jì)算后得到COMPREPLY=(aa bb cc), 則輸入 ./test.sh 之后, 按tab鍵,可以自動(dòng)彈出候選選項(xiàng)aa bb cc。
解釋的話說的有點(diǎn)多,下面直奔主題了
[plain] view plaincopy如果有同學(xué)對(duì)eval命令不了解,就找度娘吧。
上面我們做了一個(gè)約定,要獲取命令<command>的選項(xiàng),則總是調(diào)用函數(shù)__cmd_<command>獲得,因此下面就要實(shí)現(xiàn)__cmd_bsu, __cmd_pushbaseline, __cmd_createrepo
[plain] view plaincopy[plain] view plaincopy
命令自動(dòng)補(bǔ)全都到此為止,篇幅有點(diǎn)長(zhǎng)了,下面長(zhǎng)話短說,直接處理命令,以命令 bsu ?pushbaseline --platform=qcom ? --name=NX01 --multi 為例
在bsu函數(shù)中完成命令轉(zhuǎn)發(fā),在各個(gè)子命令中詳細(xì)解析參數(shù)
[plain] view plaincopy解析命令的關(guān)鍵一點(diǎn),對(duì)于--xxx=YY的選項(xiàng),可以使用模式匹配運(yùn)算符快速得到想要的選項(xiàng)。這里簡(jiǎn)單起見,沒有將代碼做很多的形式化,有需要的話,只要利用eval函數(shù),相信難不倒各位看官。
over,happy new year to everyone!
總結(jié)
以上是生活随笔為你收集整理的linux shell中的命令自动补全(compgen complete)与 命令行参数解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell 命令行实现
- 下一篇: getopt:命令行选项、参数处理