Shell 腳本中字符串處理,內置操作符避免啟動外部進程,效能碾壓 awk/sed/expr。實測長度獲取快 50+ 倍。掌握這套語法,腳本又快又優雅。
| 語法 | 含義 | 備註 |
|---|---|---|
${var:-DEFAULT} | var 未設置或為空時用 DEFAULT | 最常用 |
${var:=DEFAULT} | 同上且將 DEFAULT 賦給 var | 會修改變量 |
${var:+OTHER} | var 已設置且非空時用 OTHER | |
${var:?ERR_MSG} | var 未設置則拋錯誤並退出 | 腳本健壯性 |
${!prefix*} | 匹配所有 prefix 開頭的已聲明變量 | 調試利器 |
| 操作 | 語法 | 示例 |
|---|---|---|
| 長度 | ${#str} | ${#"hello"} → 5 |
| 從位置截取 | ${str:pos} / ${str:pos:len} | ${str:2:3} |
| 刪除前綴(最短/最長) | ${str#pat} / ${str##pat} | 路徑取文件名:${path##*/} |
| 刪除後綴(最短/最長) | ${str%pat} / ${str%%pat} | 路徑取目錄:${path%/*} |
| 替換首個/全部 | ${str/pat/rep} / ${str//pat/rep} | 斜槓轉義:${str//\//\\} |
| 前綴/後綴替換 | ${str/#pat/rep} / ${str/%pat/rep} |
注意:pattern 支持正則表達式。
# 內置操作符
time for i in {1..10000}; do a=${#test}; done
# real 0m0.173s
# expr 外部命令
time for i in {1..10000}; do a=$(expr length "$test"); done
# real 0m9.734s
結論:內置操作符快 50+ 倍。腳本編程鐵律:能用內置絕不用外部命令。
basename /path/to/file ≡ ${path##*/}dirname /path/to/file ≡ ${path%/*}內置操作符語法雖稍顯晦澀,但效能優勢壓倒性,核心腳本必掌握。