首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Bash 命令行處理 12 步驟深度解析:引號、擴展、別名、參數、命令替換、路徑展開

     編輯:MySQL 資料庫相關知識

Bash 讀取每行輸入 (管道行) 經歷 12 個處理階段,理解這流程能避免 90% 的腳本 Bug。本文結合流程圖詳細解析每階段行為與實戰技巧。

12 步驟總覽

  1. Token 化:依元字符分割 (空白、;、(、)、<、>、|、&)
  2. 複合命令檢測:首 Token 是否為保留字 (if/while/function/{/()
  3. 別名展開:首 Token 匹配別名 → 替換並回到步驟 1 (遞歸)
  4. 大括號展開:{a,b}c → ac bc
  5. 波浪號展開:~user → 家目錄
  6. 參數展開:$var、${var:-default}、${#var} 等 (雙引號內執行)
  7. 命令替換:$(cmd) / `cmd` (遞歸處理命令行)
  8. 算術展開:$((expr)) (雙引號內執行)
  9. 單詞分割:依 IFS 分割 (雙引號內抑制)
  10. 路徑名展開:* ? [...] (雙引號內抑制)
  11. 命令查找:函數 → 內建命令 → PATH 可執行檔
  12. 執行:帶入參數運行命令

關鍵引號機制對比

機制單引號 ''雙引號 ""無引號
參數展開否是是
命令替換否是是
算術展開否是是
單詞分割否否是
路徑展開否否是
字面意義完全保留部分保留無

實戰技巧

  • eval:再次掃描命令行 (步驟 1-12),慎用,注入風險高
  • 陣列變數:arr=(a b c)、"${arr[@]}" 保持元素邊界
  • IFS 修改影響單詞分割,建議局部修改:IFS=, read -ra arr <<< "$str"
  • 除錯:set -x 追蹤展開後命令、bash -x script.sh

常見陷阱範例


# 陷阱 1:for 迴圈未加引號
for f in *.txt; do echo $f; done  # 正常
for f in $files; do echo $f; done  # $files 含空格會錯誤分割

# 陷阱 2:命令替換未加引號
echo $(ls)      # 結果經單詞分割+路徑展開
echo "$(ls)"    # 保留換行與空格

# 陷阱 3:別名遞歸
alias ls='ls --color=auto'
ls  # 展開為 ls --color=auto,首 Token 仍為 ls,但步驟3不再展開 (避免無限遞歸)

結語

Bash 命令行 12 步驟是 Shell 腳本行為的底層邏輯。掌握 引號抑制展開、參數/命令/算術展開順序、IFS 分割、路徑展開時機,能寫出健壯、可預測、安全的腳本。建議配合 shellcheck 靜態分析工具檢查常見問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved