Linux中國

使用 Argbash 來改進你的 Bash 腳本

你編寫或維護過有意義的 bash 腳本嗎?如果回答是,那麼你可能希望它們以標準且健壯的方式接收命令行參數。Fedora 最近得到了一個很好的附加組件,它可以幫助你生成更好的腳本。不用擔心,它不會花費你很多時間或精力。

為什麼需要 Argbash?

Bash 是一種解釋性的命令行語言,沒有標準庫。因此,如果你編寫 bash 腳本並希望命令行界面符合 POSIXGNU CLI 標準,那麼你一般只有兩種選擇:

  1. 直接編寫為腳本量身定製的參數解析功能(可使用內置的 getopts)。
  2. 使用外部 bash 模塊。

第一個選項看起來非常愚蠢,因為正確實現介面並非易事。但是,從 Stack OverflowBash Hackers wiki 的各種站點上,它卻被認為是最佳選擇。

第二個選項看起來更聰明,但使用模塊有它自己的問題。最大的問題是你必須將其代碼與腳本捆綁在一起。這可能意味著:

  • 要麼,你將庫作為單獨的文件分發
  • 或者,在腳本的開頭包含庫代碼

有兩個文件而不是一個是愚蠢的;但採用一個文件的話,會讓一堆上千行的複雜代碼污染了你的腳本。

這是 Argbash 項目誕生的主要原因。Argbash 是一個代碼生成器,它為你的腳本生成一個量身定製的解析庫。與其他 bash 模塊的通用代碼不同,它生成你的腳本所需的最少代碼。此外,如果你不需要 100% 符合那些 CLI 標準的話,你可以生成更簡單的代碼。

示例

分析

假設你要實現一個腳本,它可以在終端窗口中繪製條形圖,你可以通過重複一個字元選定的次數來做到這一點。這意味著你需要從命令行獲取以下信息:

  • 哪個字元是組成該行的元素。如果未指定,使用破折號 -。 在命令行上,這是個單值定位參數 character,其默認值為 -。(LCTT 譯註:定位參數是指確定位置的參數,此處 character 需是命令行的第一個參數)
  • 直線的長度。如果未指定,會選擇 80。 這是一個單值可選參數 length,默認值為 80
  • Verbose 模式(用於調試)。 這是一個布爾型參數 verbose,默認情況下關閉。

由於腳本的主體非常簡單,因此本文主要關注從命令行獲取用戶的輸入到合適的腳本變數。Argbash 生成的代碼會將參數解析結果保存到 shell 變數 _arg_character_arg_length_arg_verbose 當中。

執行

接下來,你還需要 argbash-initargbash 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, argsparsebash-modules/arguments,你將看到 Argbash 強大的簡單性。如果出現了嚴重的錯誤,你需要快速修復解析功能中的一個故障,Argbash 也允許你這樣做。

由於你很有可能是 Fedora 用戶,因此你可以享受從官方倉庫安裝命令行 Argbash 的便利。不過,也有一個在線解析代碼生成器服務可以使用。此外,如果你在伺服器上使用 Docker 工作,你可以試試 Argbash Docker 鏡像

這樣你可以讓你的腳本具有令用戶滿意的命令行界面。Argbash 隨時為你提供幫助,你只需付出很少的努力。

via: https://fedoramagazine.org/improve-bash-scripts-argbash/

作者:Matěj Týč 譯者:MjSeven 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國