格式化 Shell 腳本利器,輕松理解復(fù)雜代碼
什么是shfmt?
shfmt 由 Dustin Krysak 開發(fā),是一個 Shell 格式化程序、解析器和解釋器。該項目本身托管在 GitHub 上,并有一個清晰的 README 和清晰的存儲庫。該工具是用 Go 開發(fā)的,支持 POSIX、Bash 和 mksh shell。這使得 shfmt 成為一個真正通用的程序,而不是僅限于 Bash。
安裝shfmt
要在支持 snap 的 Linux 發(fā)行版(如 Ubuntu 和 Mint)上安裝shfmt,請在終端中執(zhí)行以下命令:
linuxmi@linuxmi:~/www.linuxmi.com$ sudo snap install shfmt
要在基于 RedHat/Yum 的 Linux 發(fā)行版(如 RHEL、Centos 和 Fedora)上安裝shfmt,請在終端中執(zhí)行以下命令:
注意:在執(zhí)行第一個命令后和執(zhí)行下一個命令之前,您必須重新啟動計算機(或注銷并重新登錄)。
sudo dnf install snapd
sudo snap install snap-store
sudo snap install shfmt
在 RHEL 和 Centos 上,您可能還必須先安裝EPEL 存儲庫。
使用 shfmt
安裝 snap 包后,您可以開始使用 shfmt。
linuxmi@linuxmi:~/www.linuxmi.com$ shfmt --help
讓我們先定義一個非常糟糕的格式和編寫的腳本,linuxmi.com.sh如下圖所示。
這個腳本有幾個問題,最突出的是它的格式。但是腳本中也有一個error/bug:func最后一行的函數(shù)調(diào)用后面跟著括號。Bash 中的函數(shù)調(diào)用(而不是函數(shù)定義)應(yīng)該只有名稱,而不是括號。
讓我們看看shfmt對此有何看法。
linuxmi@linuxmi:~/www.linuxmi.com$ shfmt linuxmi.sh
雖然輸出看起來有點晦澀,但請注意術(shù)語foo(此處使用)和bar(現(xiàn)在此處未使用)經(jīng)常在 IT 圈子中用于indicate/represent 任何類似的習(xí)語或元素。foo這里真的是指func。
即便如此,該消息仍然有點晦澀,最后一行,真正發(fā)生的是函數(shù)定義(而不是函數(shù)調(diào)用)的開始,因為包含了兩個括號。這就解釋了為什么該消息告訴我們需要更多的東西;后面必須有一個聲明。shmft在這里尋找類似func(){ some_command[s]; }的東西。
答對了!這增加了shfmt作為 shell 腳本驗證/檢查器工具的功能,非常方便!
我們修復(fù)了我們剛才的錯誤,現(xiàn)在輸入腳本linuxmi.sh如下圖所示。
我們再次對代碼執(zhí)行shfmt并收到更合適且格式正確的輸出:
太好了?,F(xiàn)在,我們可以更進一步,并告訴shfmt我們希望使用兩個空格的縮進/制表符寬度而不是完整的制表符。我總是使用兩個空格作為縮進/制表符寬度來編寫代碼,并在下一行的命令與前一行密切相關(guān)的地方使用額外的空格,比如一個連續(xù)的命令等等,盡管這種情況并不經(jīng)常發(fā)生。多年來,我發(fā)現(xiàn)這兩個空間是個人和共享項目的理想選擇。
每個人和每個項目都必須找到自己理想的語法,但請注意,如果您使用像shfmt上面示例中呈現(xiàn)的格式那樣的大制表符(8 個空格),您的代碼可能會變得更難閱讀。
我們將使用-i選項將縮進/制表符寬度設(shè)置為兩個空格(--help定義為縮進:0 表示制表符(默認),>0 表示空格數(shù)):shfmt -i 2 linuxmi.sh這將上圖中的腳本呈現(xiàn)如下圖。
太棒了!然而,我們注意到,我們故意犯的錯誤shfmt并沒有檢測到:#!/bin/bash__是不正確,應(yīng)該使用#!/bin/bash代替。
因此,除了使用shfmt更好地格式化腳本之外,還有使用shellcheck來查找腳本錯誤的用例。(見:https://www.linuxmi.com/shellcheck-bugs-linux-shell.html)。然而,有趣的是,在這種特殊情況下,甚至shellcheck沒有注意到這個問題。這個缺陷已報告給 shellcheck 團隊,因此可能會在適當?shù)臅r候得到修復(fù)。
總結(jié)
當您使用像shfmt這樣的shell 格式化工具(如shellcheck)這樣的bug/錯誤檢查器時,編寫干凈、格式良好、沒有bug的腳本就變得很容易了。正如我們所看到的,有些事情可能直到第一次運行腳本時才被注意到。shfmt是一個小而有效的工具,它將幫助您根據(jù)您選擇的縮進格式化您的腳本和代碼。
好好享受吧。