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

使用 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)

分享創造快樂