| 語法 | 名稱 | 主要用途 |
|---|---|---|
${var} | 變量原形/界定 | 明確變量邊界,防止與後續字符混淆 |
$(cmd) | 命令替換 | 執行命令並捕獲標準輸出,替代反引號 |
() / {} | 子Shell/當前Shell分組 | 括號啟動子Shell,大括號當前Shell分組命令 |
${var:-default} 等 | 參數擴展 | 默認值、賦值、錯誤提示等條件擴展 |
$((exp)) | 算術擴展 | 整數運算(+ - * / % ** 等) |
${var%pattern} 等 | 模式匹配刪除 | 從開頭/結尾刪除最短/最長匹配 |
${var}明確變量名邊界:
var=test
echo $varAA # 輸出空(變量名被識別為 varAA)
echo ${var}AA # 輸出 testAA
實戰:批量重命名擴展名
#!/bin/bash
ext=$1
for f in *; do
[ -f "$f" ] && mv "$f" "${f}.${ext}"
done
用法:./rename.sh c 將當前目錄所有文件加 .c 後綴。
$(cmd)與反引號 `cmd` 功能相同,但優勢在於:
$(cmd1 $(cmd2))echo $(ls)
echo $(date +%Y%m%d)
() vs 大括號 {}| 特性 | (list) | { list; } |
|---|---|---|
| 運行環境 | 子 Shell (subshell) | 當前 Shell |
| 變量作用域 | 子 Shell 修改不影響父 Shell | 當前 Shell 修改生效 |
| 命令結束 | 無需分號 | 最后一條命令必須以 ; 結束 |
| 常見用途 | 命令分組、數組初始化 arr=(a b c) | 函數體、重定向分組 { cmd1; cmd2; } > file |
# 子 Shell 示例
var=1
(var=2; echo "sub: $var") # 輸出 sub: 2
echo "parent: $var" # 輸出 parent: 1
# 大括號分組重定向
{ echo "line1"; echo "line2"; } > output.txt
| 語法 | 行為 | 說明 |
|---|---|---|
${var:-default} | var 未設置或為空 → 返回 default,var 值不變 | 臨時默認值 |
${var:=default} | var 未設置或為空 → 將 default 賦給 var,並返回 default | 真正賦值 |
${var:+value} | var 已設置且非空 → 返回 value,否則返回空 | 條件替換 |
${var:?message} | var 未設置或為空 → 輸出 message 到 stderr 並退出腳本 | 強制檢查 |
# 示例
unset var
echo ${var:-hello} # hello
echo $var # (空)
echo ${var:=world} # world
echo $var # world
var=test
echo ${var:+replaced} # replaced
unset var
echo ${var:?var is required} # 輸出錯誤並 exit 1
$((exp))支持 C 風格整數運算:
echo $((3 + 5 * 2)) # 13
echo $((2 ** 10)) # 1024 (冪)
echo $((15 % 4)) # 3 (取模)
a=5; echo $((a += 3)) # 8 (賦值運算)
| 語法 | 方向 | 匹配長度 | 示例 (var=/path/to/file.txt) |
|---|---|---|---|
${var%pattern} | 結尾 | 最短 | ${var%.*} → /path/to/file |
${var%%pattern} | 結尾 | 最長 | ${var%%/*} → (空) |
${var#pattern} | 開頭 | 最短 | ${var#*/} → path/to/file.txt |
${var##pattern} | 開頭 | 最長 | ${var##*/} → file.txt |
記憶口訣:# 在鍵盤上方 → 處理開頭;% 在下方 → 處理結尾。單符號最短,雙符號最長。
# 獲取文件名不含擴展名
filename="/home/user/document.tar.gz"
base=${filename##*/} # document.tar.gz
name=${base%.*} # document.tar
ext=${base#*.} # tar.gz
# 安全獲取環境變量,未設置則報錯退出
DB_HOST=${DB_HOST:?環境變量 DB_HOST 必須設置}
DB_PORT=${DB_PORT:-3306} # 默認 3306