如何寫出安全的、基本功能完善的Bash指令碼
阿新 • • 發佈:2020-12-27
每個人或多或少總會碰到要使用並且自己完成編寫一個最基礎的Bash指令碼的情況。真實情況是,沒有人會說“哇哦,我喜歡寫這些指令碼”。所以這也是為什麼很少有人在寫的時候專注在這些指令碼上。
我本身也不是一個Bash指令碼專家,但是我會在本文中跟你展示一個最基礎最簡單的安全指令碼模板,會讓你寫的Bash指令碼更加安全實用,你掌握了之後肯定會受益匪淺。
### 為什麼要寫Bash指令碼
其實關於Bash指令碼最好的解釋如下:
>
> The opposite of "it's like riding a bike" is "it's like programming in bash".
>
> A phrase which means that no matter how many times you do something, you will have to re-learn it every single time.
>
> — Jake Wharton (@JakeWharton)
>
>
>
> December 2, 2020
意思就是,跟騎自行車相反,無論做了多少次,每次都感覺像重新學一樣。
但是Bash指令碼語言和其他一些廣受歡迎的語言,例如JavaScript一樣,他們不會輕易突然消失,雖然Bash指令碼語言不太可能成為業界的主流語言,但實際他就在我們周圍,無處不在。
Bash就像繼承了shell的衣缽一樣,在每臺linux上都可以看到他的身影,這可是大多數後端程式執行的環境,因此當你需要編寫伺服器的應用程式啟動、CI/CD步驟或整合測試用的指令碼,Bash就在那裡等著你。
將幾個命令粘在一起,將輸出從一個傳遞到另一個,然後只啟動一些可執行檔案,Bash是眾多方案中最簡單的一個。雖然用其他語言編寫更大、更復雜的指令碼更有效果,但你不能指望Python、Ruby、fish或其他任何你認為最好的程式,可以在任何地方編譯使用。所以在將其新增到某個prod server、Docker image或CI環境之前,往往會讓人三思而後行。
當然啦,Bash還遠遠不夠完美兩個字。他的語法對初學者就像一個噩夢。錯誤處理也很困難。到處都是我們必須處理掉的陷阱。
### Bash script template(Bash指令碼模板)
廢話不多說,獻上我的模板
``` bash
#!/usr/bin/env bash
set -Eeuo pipefail
trap cleanup SIGINT SIGTERM ERR EXIT
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
usage() {