首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Shell 中各類括號、大括號與參數擴展用法詳解

     編輯:MySQL 資料庫相關知識

概覽

語法名稱主要用途
${var}變量原形/界定明確變量邊界,防止與後續字符混淆
$(cmd)命令替換執行命令並捕獲標準輸出,替代反引號
() / {}子Shell/當前Shell分組括號啟動子Shell,大括號當前Shell分組命令
${var:-default} 等參數擴展默認值、賦值、錯誤提示等條件擴展
$((exp))算術擴展整數運算(+ - * / % ** 等)
${var%pattern} 等模式匹配刪除從開頭/結尾刪除最短/最長匹配

1. 變量原形:${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 後綴。

2. 命令替換:$(cmd)

與反引號 `cmd` 功能相同,但優勢在於:

  • 可巢狀:$(cmd1 $(cmd2))
  • 可讀性更強,避免與單引號混淆
echo $(ls)
echo $(date +%Y%m%d)

3. 圓括號 () 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

4. 參數擴展:條件賦值/默認/報錯

語法行為說明
${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

5. 算術擴展:$((exp))

支持 C 風格整數運算:

echo $((3 + 5 * 2))      # 13
echo $((2 ** 10))        # 1024 (冪)
echo $((15 % 4))         # 3 (取模)
a=5; echo $((a += 3))    # 8 (賦值運算)

6. 模式匹配刪除:前綴/後綴裁剪

語法方向匹配長度示例 (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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved