當前位置:成語大全網 - 書法字典 - Linux Shell腳本的最佳實踐

Linux Shell腳本的最佳實踐

它是路邊社

與其他編碼標準壹樣,這裏討論的不僅是編碼格式的美感,還有壹些約定和編碼標準。本文件主要關註我們通常遵循的規則,我們盡量避免為那些沒有明確強制性的規則提供意見。

編碼規範對程序員特別重要,原因如下:

本文件中的指南力求最大限度地遵循以下原則:

雖然本文檔涵蓋了許多基礎知識,但需要註意的是,沒有任何編碼規範可以為我們回答所有問題,開發人員在編寫代碼後總是需要對上述原則做出正確的判斷。

註意:如果沒有明確指定,則默認為強制。

主要參考以下文件:

Shell僅被推薦作為相對簡單的實用程序或包裝腳本。因此,單個shell腳本的內容不應太復雜。

在選擇何時使用shell腳本時,應遵循以下原則:

不建議對可執行文件使用擴展名,庫文件必須使用。sh作為擴展名,並且不應該是可執行的。

執行程序時,您不需要知道它的編寫語言,shell腳本也不需要擴展名,因此您更希望可執行文件沒有擴展名。

對於圖書館檔案來說,了解他們的書寫語言非常重要。使用。sh作為特定語言後綴的擴展名可以與用其他語言編寫的庫文件區分開來。

文件名應該全部小寫,並且可以包含下劃線或連字符。建議對可執行文件使用連字符,對庫文件使用下劃線。

正面例子:

反例:

源文件編碼格式是UTF-8。避免不同操作系統處理文件換行符的不同方式,並始終使用LF。

每行不超過120個字符。每行代碼的最大長度限制的根本原因是過長的行會導致閱讀障礙並使縮進無效。

以下兩種情況除外:

如果出現長度超過120個字符的字符串,您應該嘗試使用適當的方法將其縮短,例如在文檔中或嵌入換行符。

示例:

除了在行尾使用換行符之外,空格是源文件中唯壹允許的空白字符。

從未使用或註釋過的方法、變量等。必須堅決清理出代碼,以避免過多垃圾造成的幹擾。

Bash是唯壹允許的可執行腳本shell。

可執行文件必須以#開頭!/bin/bash。請使用set來設置shell的選項,以便bash顯示“process $: done making $ $ $。”

#示例7:命令參數和路徑不需要引號grep-Li Hugo/dev/“$ 1”。

#示例8:雙引號用於常規變量,引號git send-email-to“$ { reviewers }“$ { ccs:+“-cc“$ { CCS }“}不需要用於CCS可能為空的特殊情況。

#示例9:單引號用於正則化,引號grep-CP‘(【ss】special | |?在$1可能為空的特殊情況下不需要。characters *)$ { 1:+“$ 1“}

#示例10:建議使用帶引號的“$ @”來傳遞位置參數,所有參數都作為帶引號的“$ *“# t . sh func _ t { echo num:$ # echo args:1:$ 1 2:$ 2 3 }內容的單個字符串傳遞。

func _ t“$ @“func _ t“$ *“#執行時。/t.shabbc,輸出如下:num:3 args:1:a2:B3:Cnum:1 args:1:ABC 2:3:

使用$(命令)而不是反引號。

因為反引號是嵌套的,所以需要用反斜杠對內部反引號進行轉義。但是,以$(command)的形式嵌套不需要轉義,可讀性更好。

正面例子:

反例:

條件測試

使用【【...】】而不是【、test和/usr/bin/【。

因為【【和】】之間沒有路徑擴展或分詞,使用【【...】】可以減少錯誤。和【【...】】支持正則表達式匹配,但【...】沒有。請參考以下示例:

盡可能使用變量引用而不是字符串過濾。

Bash可以很好地處理空字符串測試。請使用空/非空字符串測試方法而不是過濾字符,以使代碼更具可讀性。正面例子:

反例:

正面例子:

反例:

正面例子:

反例:

文件擴展名

當使用通配符擴展文件名時,請指定壹個清晰的路徑。

當目錄中有特殊文件名時,例如以-開頭的文件,在路徑中使用擴展通配符會安全得多。/*比沒有路徑的*安全得多。

應避免評估。

Eval在用於分配變量時會修改輸入,但在設置變量時無法檢查這些變量是什麽。反例:

使用進程替換或for循環而不是管道while循環。

這是因為在管道後的while循環中,命令在子shell中運行,因此無法將對變量的修改傳遞給父shell。

這種連接while循環中隱式子shell的管道使得定位bug非常困難。反例:

如果您確定輸入不包含空格或其他特殊符號(通常不是來自用戶輸入),您可以使用for循環來代替。例如:

使用進程替換重定向輸出,但是將命令放在顯式子shell中,而不是由while循環創建的隱式子shell中。例如:

始終檢查返回值並提供有用的返回值。

對於非管道命令,使用$?或者直接通過if語句檢查以保持簡潔。

例如:

當內置命令可以完成相同的任務時,應盡可能在shell內置命令和外部命令之間選擇內置命令。

因為內置命令的依賴性比外部命令小,而且在大多數情況下,調用內置命令可以獲得比調用外部命令更好的性能(通常外部命令會產生額外的進程開銷)。

正面例子:

反例:

不建議使用。加載外部庫文件,但建議使用source,它提高了可讀性。正面例子:

反例:

除非必要,否則盡量使用單個命令及其參數組合來完成任務,而不是多個命令和管道的不必要組合。常見且不推薦的用法,如:cat和grep壹起使用過濾字符串;Cat和wc壹起用於計算行數;Grep和wc壹起用於計算行數。

正面例子:

除特殊情況外,幾乎所有函數都不應使用exit直接退出腳本,而應使用return返回,以便在後續邏輯中處理錯誤。正面例子:

反例:

建議使用以下工具來幫助我們標準化代碼:

原文鏈接:http://itxx00 . github . io/blog/2020/01/03/shell-standards/

獲取更多面試問題、腳本和其他運維資料。點擊:運維知識社區訪問。

腳本壹-短信炸彈客

劇本壹——QQ微信炸彈人

Ansible -壹鍵構建redis5.0.5集群。

Elk7.9真實集群docker部署文檔

世界上最全面的loki部署和配置文檔。

最強的安全強化腳本2.0

壹鍵式設置iptbales腳本