Bash 字串處理的 20 個技巧
在 Linux 系統管理與自動化腳本開發中,字串處理是 Bash 最核心也最常被忽視的領域。許多初學者習慣依賴 sed、awk 或外部工具來處理字串,但其實 Bash 內建參數擴展(Parameter Expansion)功能強大且執行效率極高。本文將整理 20 個實用的 Bash 字串處理技巧,幫助你寫出更精簡、高效的 Shell 腳本。
1. 基礎變數操作
首先,我們從最基本的變數設定與讀取開始。
# 1. 設定變數
name="Linux"
# 2. 讀取變數
echo $name
# 3. 使用預設值(當變數為空或未設定時)
echo ${empty_var:-"default_value"}
# 4. 強制設定值(僅當變數為空時設定,不改變已存在的值)
config_path="${CONFIG_PATH:-/etc/config}"
echo $config_path
2. 字串長度與替換
處理檔案路徑或配置檔時,獲取長度與替換子字串非常頻繁。
str="Hello World"
# 5. 獲取字串長度
echo ${#str} # 輸出 11
# 6. 替換第一個匹配項
echo ${str/World/Bash} # 輸出 Hello Bash
# 7. 替換所有匹配項
echo ${str//o/O} # 輸出 HellO WOrld
3. 字串截取(Substring)
截取字串是提取資料的關鍵技巧,特別是用於解析路徑或版本號。
path="/usr/local/bin/bash"
# 8. 從索引 5 開始截取 5 個字元
echo ${path:5:5} # 輸出 local
# 9. 從倒數第 5 個字元開始截取(包含該字元)
echo ${path: -5} # 輸出 bash
# 10. 刪除開頭的最短匹配
echo ${path#*/} # 輸出 usr/local/bin/bash
# 11. 刪除開頭的最長匹配
echo ${path##*/} # 輸出 bash
# 12. 刪除結尾的最短匹配
echo ${path%/*} # 輸出 /usr/local/bin
# 13. 刪除結尾的最長匹配
echo ${path%%/*} # 輸出空字串(因為從第一個 / 開始刪)
4. 大小寫轉換與檢查
在處理檔案名稱或使用者輸入時,統一大小寫至關重要。
text="Hello World"
# 14. 轉為大寫
echo ${text^^} # 輸出 HELLO WORLD
# 15. 轉為小寫
echo ${text,,} # 輸出 hello world
# 16. 檢查是否為數字
if [[ $text =~ ^[0-9]+$ ]]; then
echo "is number"
else
echo "is not number" # 此例會輸出 is not number
fi
5. 進階字串操作
這些技巧能解決更複雜的資料清洗問題。
# 17. 移除開頭與結尾的空白
str_with_spaces=" Hello "
stripped=$(echo "$str_with_spaces" | xargs)
echo "$stripped" # 輸出 Hello
# 18. 重複字串
repeated=$(printf "%0.s*" {1..5})
echo $repeated # 輸出 *****
# 19. 檢查字串是否包含子字串
if [[ $path == *bin* ]]; then
echo "path contains bin"
fi
# 20. 將字串分割為陣列(基於空白)
sentence="The quick brown fox"
read -ra words <<< "$sentence"
echo ${words[2]} # 輸出 brown
常見問題與注意事項
在使用 Bash 字串處理時,新手常遇到以下兩個問題:
- 空白字串與未設定變數的區別:
${var:-default}與${var-default}不同。前者在變數為空字串時也會使用預設值,後者則僅在變數未設定時使用。若需區分「空」與「未設定」,請使用${var+value}。 - 特殊字元的轉義:當替換的字串包含
/或其他特殊字元時,建議使用其他分隔符號,例如${path//\/home\/user/~/new},或使用sed處理極複雜的替換邏輯,以避免語法錯誤。
小結
掌握這 20 個技巧,足以應付 90% 以上的 Shell 腳本字串處理需求。內建功能不僅執行速度快,還能減少對外部工具的依賴,讓腳本更具可攜性。建議在撰寫腳本時,優先嘗試使用 ${} 語法,僅在極複雜的場景下才考慮 sed 或 awk。