星期日, 4月 09, 2023

Shell Script 最佳實踐

來源:Shell Script Best Practice

這篇寫的很好,整理並摘錄裡面的內容

  1. 用 bash,不要用 zsh / fish
  2. 一開頭的 Sha-Bang 統一都寫 #!/usr/bin/env bash,這樣可以確保都是用相同的 shell 來執行,我自己是都寫 #!/bin/bash
  3. 副檔名用 .sh
  4. 第二行寫 set -o errexit,只要裏面有一行錯誤,就離開,不要繼續。
  5. 第三行寫 set -o nounset,只要有未設定的變數,就離開,不要繼續。
  6. 第四行寫 set -o pipefail,只要 pipe 過程中的指令有錯誤,就離開,不要繼續。
  7. 加上判斷 TRACE 環境參數是否存在的腳本,當有設定這個環境變數時,就加上 set -o xtrace,這可以幫助除錯。
  8. 儘量使用 [[ ]]取代 [ ][[ ]]是 bash內建的關鍵字,基本上作用跟 []或 test 一樣,可以減少額外消耗,而且有更多功能。
  9. 存取變數時,前後都加上雙引號。
  10. 函式裏面用 local 宣告變數。
  11. 加上 -h--help來說明自己怎麼使用。
  12. 印出錯誤訊息時,要導向到 stderr :echo 'Something unexpected happened' >&2
  13. 呼叫指令若有帶參數,最好帶長的,例如用 --silent代替 -s,這樣可讀性比較高。
  14. 一開始就切換到腳本的目錄,例如: cd "$(dirname "$0")" 我想這個應該是要確定腳本所要作用的目錄,所以加上註解,或是印出當前所在目錄,都對於後續維護的人會很有幫助。
  15. shellcheck來檢查腳本

作者有提供一個範本,可以直接複製來修改:

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail
if [[ "${TRACE-0}" == "1" ]]; then
    set -o xtrace
fi

if [[ "${1-}" =~ ^-*h(elp)?$ ]]; then
    echo 'Usage: ./script.sh arg-one arg-two

This is an awesome bash script to make your life better.

'
    exit
fi

cd "$(dirname "$0")"

main() {
    echo do awesome stuff
}

main "$@"

基本上就包含了前面所提到的重點,這裡額外一提的是有 main,這對於理解腳本來說,也是很重要的事情。

沒有留言: