歡迎光臨
每天分享高質量文章

使用 Argbash 來改進你的 Bash 腳本 | Linux 中國

Argbash 是一個代碼生成器,它為你的腳本生成一個量身定製的解析庫。與其他 bash 模塊的通用代碼不同,它生成你的腳本所需的最少代碼。
— Matěj Týč


致謝
編譯自 | 
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] 標準,那麼你一般只有兩種選擇:

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

第一個選項看起來非常愚蠢,因為正確實現接口並非易事。但是,從 Stack Overflow[4] 到 Bash Hackers[5] wiki 的各種站點上,它卻被認為是最佳選擇。

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

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

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

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

示例

分析

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

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

由於腳本的主體非常簡單,因此本文主要關註從命令列獲取用戶的輸入到合適的腳本變數。Argbash 生成的代碼會將引數解析結果儲存到 shell 變數 _arg_character_arg_length 和 _arg_verbose 當中。

執行

接下來,你還需要 argbash-init 和 argbash bash 腳本,它們是 argbash 包的一部分。因此,運行以下命令:

  1. 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],然後通過編輯腳本的模板部分來解決問題:

  1. # ...

  2. # ARG_OPTIONAL_SINGLE([length],[l],[Length of the line],[80])

  3. # ARG_OPTIONAL_BOOLEAN([verbose],[V],[Debug mode])

  4. # ARG_POSITIONAL_SINGLE([character],[The element of the line],[-])

  5. # ARG_HELP([The line drawer])

  6. # ...

Argbash 非常智慧,它試圖讓每個生成的腳本都成為自己的模板,這意味著你不需要儲存源模版以供進一步使用,你也不要丟掉生成的 bash 腳本。現在,嘗試重新生成如你所預期的下一個線條繪圖腳本:

  1. argbash script -o script

  2. ./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中國 榮譽推出

赞(0)

分享創造快樂