使用 Argbash 來改進你的 Bash 腳本
你編寫或維護過有意義的 bash 腳本嗎?如果回答是,那麼你可能希望它們以標準且健壯的方式接收命令行參數。Fedora 最近得到了一個很好的附加組件,它可以幫助你生成更好的腳本。不用擔心,它不會花費你很多時間或精力。
為什麼需要 Argbash?
Bash 是一種解釋性的命令行語言,沒有標準庫。因此,如果你編寫 bash 腳本並希望命令行界面符合 POSIX 和 GNU CLI 標準,那麼你一般只有兩種選擇:
- 直接編寫為腳本量身定製的參數解析功能(可使用內置的
getopts
)。 - 使用外部 bash 模塊。
第一個選項看起來非常愚蠢,因為正確實現介面並非易事。但是,從 Stack Overflow 到 Bash Hackerswiki 的各種站點上,它卻被認為是最佳選擇。
第二個選項看起來更聰明,但使用模塊有它自己的問題。最大的問題是你必須將其代碼與腳本捆綁在一起。這可能意味著:
- 要麼,你將庫作為單獨的文件分發
- 或者,在腳本的開頭包含庫代碼
有兩個文件而不是一個是愚蠢的;但採用一個文件的話,會讓一堆上千行的複雜代碼污染了你的腳本。
這是 Argbash 項目誕生的主要原因。Argbash 是一個代碼生成器,它為你的腳本生成一個量身定製的解析庫。與其他 bash 模塊的通用代碼不同,它生成你的腳本所需的最少代碼。此外,如果你不需要 100% 符合那些 CLI 標準的話,你可以生成更簡單的代碼。
示例
分析
假設你要實現一個腳本,它可以在終端窗口中繪製條形圖,你可以通過重複一個字元選定的次數來做到這一點。這意味著你需要從命令行獲取以下信息:
- 哪個字元是組成該行的元素。如果未指定,使用破折號
-
。 在命令行上,這是個單值定位參數character
,其默認值為-
。(LCTT 譯註:定位參數是指確定位置的參數,此處character
需是命令行的第一個參數) - 直線的長度。如果未指定,會選擇
80
。 這是一個單值可選參數length
,默認值為80
。 - Verbose 模式(用於調試)。 這是一個布爾型參數
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,然後通過編輯腳本的模板部分來解決問題:
# ...
# 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, argsparse 或 bash-modules/arguments,你將看到 Argbash 強大的簡單性。如果出現了嚴重的錯誤,你需要快速修復解析功能中的一個故障,Argbash 也允許你這樣做。
由於你很有可能是 Fedora 用戶,因此你可以享受從官方倉庫安裝命令行 Argbash 的便利。不過,也有一個在線解析代碼生成器服務可以使用。此外,如果你在伺服器上使用 Docker 工作,你可以試試 Argbash Docker 鏡像。
這樣你可以讓你的腳本具有令用戶滿意的命令行界面。Argbash 隨時為你提供幫助,你只需付出很少的努力。
via: https://fedoramagazine.org/improve-bash-scripts-argbash/
作者:Matěj Ty? 譯者:MjSeven 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
推薦閱讀: