https://fedoramagazine.org/improve-bash-scripts-argbash/
作者 | Matěj Týč
譯者 | MjSeven ?????共計翻譯:73.0 篇 貢獻時間:270 天
你編寫或維護過有意義的 bash 指令碼嗎?如果回答是,那麼你可能希望它們以標準且健壯的方式接收命令列引數。Fedora 最近得到了一個很好的附加元件[1],它可以幫助你生成更好的指令碼。不用擔心,它不會花費你很多時間或精力。
為什麼需要 Argbash?
Bash 是一種解釋性的命令列語言,沒有標準庫。因此,如果你編寫 bash 指令碼並希望命令列介面符合 POSIX[2] 和 GNU CLI[3] 標準,那麼你一般只有兩種選擇:
getopts
)。第一個選項看起來非常愚蠢,因為正確實現介面並非易事。但是,從 Stack Overflow[4] 到 Bash Hackers[5] wiki 的各種站點上,它卻被認為是最佳選擇。
第二個選項看起來更聰明,但使用模組有它自己的問題。最大的問題是你必須將其程式碼與指令碼捆綁在一起。這可能意味著:
有兩個檔案而不是一個是愚蠢的;但採用一個檔案的話,會讓一堆上千行的複雜程式碼汙染了你的指令碼。
這是 Argbash 專案誕生[1]的主要原因。Argbash 是一個程式碼生成器,它為你的指令碼生成一個量身定製的解析庫。與其他 bash 模組的通用程式碼不同,它生成你的指令碼所需的最少程式碼。此外,如果你不需要 100% 符合那些 CLI 標準的話,你可以生成更簡單的程式碼。
示例
分析
假設你要實現一個指令碼,它可以在終端視窗中繪製條形圖[6],你可以透過重覆一個字元選定的次數來做到這一點。這意味著你需要從命令列獲取以下資訊:
-
。 在命令列上,這是個單值定位引數 character
,其預設值為 -
。(LCTT 譯註:定位引數是指確定位置的引數,此處 character
需是命令列的第一個引數)80
。 這是一個單值可選引數 length
,預設值為 80
。verbose
,預設情況下關閉。由於指令碼的主體非常簡單,因此本文主要關註從命令列獲取使用者的輸入到合適的指令碼變數。Argbash 生成的程式碼會將引數解析結果儲存到 shell 變數 _arg_character
、_arg_length
和 _arg_verbose
當中。
執行
接下來,你還需要 argbash-init
和 argbash
bash 指令碼,它們是 argbash 包的一部分。因此,執行以下命令:
sudo dnf install argbash
然後,使用 argbash-init
來為 argbash
生成模板,它會生成可執行指令碼。你需要三個引數:一個名為 character
的定位引數,一個可選的 length
引數以及一個可選的布林 verbose
。將這些傳遞給 argbash-init
,然後將輸出傳遞給 argbash
: argbash-init --pos character --opt length --opt-bool verbose script-template.sh argbash script-template.sh -o script ./script
看到幫助資訊了嗎?看起來該指令碼不知道字元引數的預設選項。因此,看一下 Argbash API[7],然後透過編輯指令碼的模板部分來解決問題:
# ...
# ARG_OPTIONAL_SINGLE([length],[l],[Length of the line],[80])
# ARG_OPTIONAL_BOOLEAN([verbose],[V],[Debug mode])
# ARG_POSITIONAL_SINGLE([character],[The element of the line],[-])
# ARG_HELP([The line drawer])
# ...
Argbash 非常智慧,它試圖讓每個生成的指令碼都成為自己的模板,這意味著你不需要儲存源模版以供進一步使用,你也不要丟掉生成的 bash 指令碼。現在,嘗試重新生成如你所預期的下一個線條繪圖指令碼:
argbash script -o script
./script
如你所見,一切正常。剩下要做的唯一事情就是完成線條繪圖功能。
結論
你可能會發現包含解析程式碼的部分很長,但考慮到它允許你以 ./script.sh x -Vl50
的方式呼叫,並且能像 ./script -V -l 50 x
一樣工作。確實需要一些程式碼才能做到這一點。
但是,透過呼叫 argbash-init
並將引數 -mode
設定為 minimal
,你可以平衡生成的程式碼複雜度和解析能力,而轉向更簡單的程式碼。這個選項將指令碼的大小減少了大約 20 行,這相當於生成的解析程式碼大小減少了大約 25%。另一方面,full
樣式使指令碼更加智慧。
如果你想要檢查生成的程式碼,請給 argbash
提供引數 -commented
,它會將註釋放入解析程式碼中,從而揭示各個部分背後的意圖。與其他引數解析庫相比較,如 shflags[8], argsparse[8] 或 bash-modules/arguments[9],你將看到 Argbash 強大的簡單性。如果出現了嚴重的錯誤,你需要快速修複解析功能中的一個故障,Argbash 也允許你這樣做。
由於你很有可能是 Fedora 使用者,因此你可以享受從官方倉庫安裝命令列 Argbash 的便利。不過,也有一個線上解析程式碼生成器[10]服務可以使用。此外,如果你在伺服器上使用 Docker 工作,你可以試試 Argbash Docker 映象[11]。
這樣你可以讓你的指令碼具有令使用者滿意的命令列介面。Argbash 隨時為你提供幫助,你只需付出很少的努力。
via: https://fedoramagazine.org/improve-bash-scripts-argbash/
作者:Matěj Týč[13] 譯者:MjSeven 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出