Shell 腳本處理文字是日常運維與自動化的基礎功夫。本文系統整理 Shell 中字串操作的核心技巧,包含長度計算、子串定位、切片擷取、模式比對與替換,所有範例均經實測可直接套用。
string="abc12342341" # 等號兩邊不可有空格
echo ${#string} # 結果:11(推薦,最簡潔)
expr length "$string" # 結果:11
expr "$string" : ".*" # 結果:11(正則匹配全字串)
expr index "$string" '123' # 結果:4(注意:Shell 索引從 1 開始,非 0)
類似 JavaScript 的 indexOf,但起始索引不同,移植邏輯時需留意。
expr match "$string" 'abc.*3' # 結果:9(匹配 "abc123423")
實務上較少用,通常改用 expr "$string" : 'pattern'。
| 語法 | 結果 | 說明 |
|---|---|---|
${string:4} | 2342341 | 從索引 4 到結尾 |
${string:3:3} | 123 | 從索引 3 取 3 字元 |
${string: -4} | 2341 | 取後 4 字元(冒號後需有空格) |
${string:(-4)} | 2341 | 同以上,括號寫法更清晰 |
expr substr $string 3 3 | 123 | expr 索引從 1 起算 |
語法與 PHP substr、Python 切片高度相似,熟悉其他語言者極易上手。
# 顯示匹配到的內容(而非長度)
expr match "$string" '\([a-c]*[0-9]*\)' # abc12342341
expr "$string" : '\([a-c]*[0-9]\)' # abc1(只匹配第一個數字)
expr "$string" : '.*\([0-9][0-9][0-9]\)' # 341(取最後三位數字)
括號 \( \) 為捕獲組,僅輸出括號內匹配內容,極利於欄位擷取。
| 語法 | 結果 | 說明 |
|---|---|---|
${string#a*3} | 42341 | 從左刪除最短匹配 a*3 |
${string##a*3} | 41 | 從左刪除最長匹配 a*3 |
${string%3*1} | abc12342 | 從右刪除最短匹配 3*1 |
${string%%3*1} | abc12 | 從右刪除最長匹配 3*1 |
口訣:# 對應開頭(左邊),% 對應結尾(右邊);單符號最短,雙符號最長。
echo ${string/23/bb} # abc1bb42341(替換第一處)
echo ${string//23/bb} # abc1bb4bb41(全域替換)
echo ${string/#abc/bb} # bb12342341(前綴匹配替換,類似 ^)
echo ${string/%41/bb} # abc123423bb(後綴匹配替換,類似 $)
Shell 字串操作雖語法獨特,但核心概念(索引、切片、正則捕獲、貪婪/非貪婪刪除)與主流語言互通。掌握上述 7 大類操作,足以應付 90% 以上的文字處理需求。建議收藏備查,實戰中靈活組合。