Bash 參數擴展(Parameter Expansion)提供強大的變數內容刪除與替換功能,無需呼叫 sed、awk 等外部工具,即可在腳本中高效處理字串。本文系統整理 #、##、%、%%、/、// 六大運算子語法與實戰範例。
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin
| 語法 | 方向 | 匹配模式 | 範例 | 結果 |
|---|---|---|---|---|
${var#pattern} | 左→右 | 最短匹配 | ${PATH#/*bin:} | 刪除 /usr/local/sbin: → /usr/local/bin:/sbin:... |
${var##pattern} | 左→右 | 最長匹配(貪婪) | ${PATH##/*bin:} | 刪除至最後一個 bin: → /root/bin |
${var%pattern} | 右→左 | 最短匹配 | ${PATH%:/*bin} | 刪除 :/root/bin → /usr/local/sbin:...:/usr/local/mysql/bin |
${var%%pattern} | 右→左 | 最長匹配(貪婪) | ${PATH%%:/*bin} | 刪除至最左邊 bin → /usr/local/sbin |

| 語法 | 範圍 | 範例 | 結果 |
|---|---|---|---|
${var/old/new} | 僅第一次匹配 | ${PATH/sbin/SBIN} | /usr/local/SBIN:/usr/local/bin:/sbin:... |
${var//old/new} | 全域替換所有匹配 | ${PATH//sbin/SBIN} | /usr/local/SBIN:/usr/local/bin:/SBIN:/bin:/usr/SBIN:... |
# 在鍵盤 $ 左側 → 從「左邊」開始刪% 在鍵盤 $ 右側 → 從「右邊」開始刪/ 單斜線 = 首次替換;// 雙斜線 = 全域替換# 刪除開頭路徑至特定目錄
${PATH#*/usr/local/} # 保留 /usr/local 之後的內容
# 替換路徑分隔符
${PATH//:/\n} # 將冒號換行,方便閱讀
# 條件替換:若變數未設定則使用預設值
${VAR:-default} # VAR 為空或未設定時用 default
${VAR:=default} # 並將 default 賦值給 VAR
| 語法 | 功能 | 模式 |
|---|---|---|
${var#pat} | 從左刪除最短匹配 | 非貪婪 |
${var##pat} | 從左刪除最長匹配 | 貪婪 |
${var%pat} | 從右刪除最短匹配 | 非貪婪 |
${var%%pat} | 從右刪除最長匹配 | 貪婪 |
${var/old/new} | 替換首次匹配 | — |
${var//old/new} | 全域替換所有匹配 | — |
掌握這六大參數擴展語法,能讓 Bash 腳本處理字串更簡潔、效能更高(避免子程序開銷),是 Shell 腳本進階的必備技能。