跳至主要内容

Linux / Bash Shell 特殊字元與萬用字元

FreeBSD Archlinux Photon_OS Oracle_linux WSL Docker

1. Shell 特殊控制字元速查表

符號名稱核心功能與行為解析實用指令範例
$變數取值符號提取變數對應的值,亦可用於環境變數或特殊變數(如 $?$$echo $USER
echo $? (回傳上一指令狀態碼)
#註解符號行首或空格後的 # 代表註解,Shell 會直接忽略其後內容# 這是註解
mkdir app # 建立目錄
\跳脫符號 (Escape)消除後續緊跟單一字元的特殊語意,還原為純文字;或作為換行延續符echo \$PATH
rm -f filename\ with\ space.txt
|管道符號 (Pipe)將左側指令的「標準輸出 (stdout)」轉向送入右側指令的「標準輸入 (stdin)」cat access.log | grep "404" | wc -l
;指令分隔符連續循序執行多條指令(不論前一條指令成功與否,後一條都會執行)cd /opt; ls -la; df -h
&背景執行工作控制將指令移至背景(Background)執行,立即釋放當前終端提示字元python3 server.py &
nohup ./backup.sh &
/目錄路徑分隔符Linux 虛擬檔案系統樹狀結構的目錄層級分隔符,最頂層單獨的 / 代表根目錄/var/log/docker.log
>輸出重導向 (覆蓋)將標準輸出導向寫入指定檔案,若檔案已存在則直接覆蓋覆寫echo "token=123" > config.env
>>輸出重導向 (追加)將標準輸出導向寫入指定檔案,追加寫入至檔案最末端而不覆蓋date >> /var/log/deploy.log
<輸入重導向將指定檔案的內容作為指令的標準輸入(取代鍵盤輸入)mysql -u root -p db < backup.sql
<<Here-Document定義一段多行文字塊作為標準輸入,直到遇見自訂的終止標籤(如 EOFcat << 'EOF' > test.txt
hello
EOF
' '單引號 (強引用)完全維持字面字元(Literal),內部所有變數、跳脫符均不解析echo '$USER' (輸出: $USER)
" "雙引號 (弱引用)保留大部分文字,但允許解析變數 ($)、指令替換 ($()) 與跳脫 (\)echo "Hi, $USER" (輸出: Hi, admin)
$( )` `指令替換優先執行括號內部的指令,並將其執行結果(stdout)回填於原處TODAY=$(date +%F)
tar -czvf "backup-$TODAY.tar.gz" /data
( )子 Shell (Subshell)在獨立衍生(Fork)的子行程中執行整組指令,其內部的目錄變更或變數不會污染外層(cd /tmp && rm -rf *) (執行完畢後本機仍留在原目錄)
{ }命令群組 / 展開1. 在當前 Shell 中群組化執行指令(需有空格與分號)。
2. 序列/字串批量展開。
{ echo 1; echo 2; }
mkdir -p /opt/{app,db,config}
cp app.yml{,.bak}

2. 萬用字元 (Wildcards / Globbing) 速查表

萬用字元主要由 Shell 在執行指令前展開(Pathname Expansion),用於匹配檔名與路徑

萬用字元匹配規則精確行為解析實用範例
*0 個到任意多個字元匹配檔名中任意長度的字串(不包含隱藏檔的開頭點 .ls *.log (列出所有 .log 結尾檔案)
rm -rf /tmp/cache*
?剛好 1 個任意字元必須且只能匹配 1 個字元(不能為 0 個,也不能超過 1 個)ls file?.txt (匹配 file1.txtfileA.txt,但不匹配 file10.txt)
[abc]集合內任一字元匹配括號內列出的任一單一字元ls report_[abc].pdf (匹配 report_a.pdfreport_b.pdf 等)
[0-9]編碼範圍內任一字元匹配 ASCII / 編碼連續範圍內的任一字元ls img_[0-9].png (匹配 0 至 9 的單碼數字)
ls [a-z]*.md (以小寫字母開頭的檔案)
[!abc]
(或 [^abc])
排除集合 (否定)不包含 括號內指定字元的任一單一字元ls file[!0-9].txt (匹配 fileA.txt,排除 file1.txt)

3. 進階工程師必備:容易混淆的邊界細節 (Tips)

3.1 邏輯運算子 &&||

  • cmd1 && cmd2 (AND):只有在 cmd1 執行成功(Exit Code = 0) 時,才會接著執行 cmd2

  • cmd1 || cmd2 (OR):只有在 cmd1 執行失敗(Exit Code ≠ 0) 時,才會執行 cmd2

  • 經典範例

    docker compose pull && docker compose up -d || echo "部署更新失敗!"

3.2 萬用字元與正則表達式 (Regex) 的差別

  • Shell 萬用字元 (Globbing):由 Shell 解析,直接對應磁碟上的檔名

    • * 代表「任意字串」。

    • ? 代表「單一字元」。

  • 正則表達式 (Regex):由特定工具(grepsedawkpython)解析,用於匹配文字內容

    • * 代表「前一個字元重複 0 到多次」。

    • . 代表「任意單一字元」。

    • .* 兩者結合才等於萬用字元的 *

3.3 大括號展開 (Brace Expansion) 的高效率用法

不用寫迴圈,直接使用大括號生成批量連續字串或檔案:

# 1. 批量建立 1 到 10 號目錄
mkdir -p node_{01..10}

# 2. 快速建立備份檔 (等於 cp nginx.conf nginx.conf.bak)
cp nginx.conf{,.bak}

# 3. 雙維度矩陣展開 (生成 a1, a2, b1, b2)
echo {a,b}{1,2}