核心原則:Shell 對空格極其敏感
空格是命令、參數、運算符的分隔符,稍有不慎就會改變語義或報錯。
高頻錯誤對照表
1. 變量賦值
| 寫法 | 結果 | 說明 |
gender=female | ✅ 正確 | 等號兩邊不能有空格 |
gender =female | ❌ 錯誤 | 視為命令 gender 參數 =female |
gender= female | ❌ 錯誤 | 視為命令 gender= 參數 female |
2. 條件測試 [ ]
| 寫法 | 結果 | 說明 |
if [ $gender = female ]; then | ✅ 正確 | 括號內兩側、運算符兩側必須有空格 |
if [$gender = female]; then | ❌ 錯誤 | [ 後缺空格 |
if [ $gender=female ]; then | ❌ 錯誤 | = 兩側缺空格,視為字符串非比較 |
3. if 與 then 同行
# 正確:then 前有分號
if [ $gender = female ]; then echo "ok"; fi
# 正確:then 換行
if [ $gender = female ]
then echo "ok"
fi
# 錯誤:then 前無分號且同行
if [ $gender = female ] then echo "ok"; fi
# 報錯:syntax error near unexpected token 'then'
4. if/elif/else 結構完整性
- 每個
if、elif 後必須跟 then。
- 缺
then 會報 syntax error near unexpected token 'else' 或 'fi'。
5. 命令與參數之間
# 正確
if [ -x "~/script.sh" ]; then ...
# 錯誤:-x 後無空格
if [ -x"~/script.sh" ]; then ...
# 視為測試字符串 "-x~/script.sh" 是否非空
6. 變量引用 $
# 正確
echo "$var"
echo "${var}"
# 錯誤:$ 與變量名/括號之間有空格
echo "$ var"
echo "${ var }"
調試技巧
bash -n script.sh:語法檢查不執行。
bash -x script.sh:逐行跟蹤執行(顯示展開後的命令)。
- 善用
shellcheck(VS Code 插件/命令行)靜態分析。
最佳實踐清單
- 變量賦值零空格:
VAR=value
[ ] 內部全空格:[ "$A" = "$B" ]
- 字符串比較用
=([ ] 內)或 ==([[ ]] 內),雙側空格。
then 同行加分號,換行免分號。
- 引用變量加雙引號:
"$VAR" 防止詞法分裂與 glob 展開。
- 優先用
[[ ]](Bash/Zsh/Ksh)替代 [ ],支持 && || =~ 等現代語法,且不需轉義括號。