Shell 腳本中充滿特殊符號,掌握其含義能讓腳本更簡潔、健壯。本文系統整理常見符號的功能、語法與實戰範例。
| 符號 | 名稱 | 核心功能 | 典型範例 |
|---|---|---|---|
# | 井號 | 註解、Shebang | #!/bin/bash, # 這是註解 |
~ | 波浪號 | 家目錄、目錄堆疊 | cd ~, ~+(PWD), ~-(OLDPWD) |
; | 分號 | 命令分隔 | cd /tmp; ls |
;; | 雙分號 | case 選項結束 | case $var in a) ;; esac |
. | 點號 | 當前目錄、來源檔案、正則匹配任一字元 | source .bashrc, ls -a |
'str' | 單引號 | 強引用,變數不展開 | echo '$HOME' → 輸出 $HOME |
"str" | 雙引號 | 弱引用,變數展開,通配符不展開 | echo "$HOME" → 輸出 /home/user |
\`cmd\` | 反引號 | 命令替換(舊語法) | date=\`date +%F\` |
$(cmd) | 命令替換 | 命令替換(推薦,可巢狀) | date=$(date +%F) |
| | 管道 | 標準輸出導向下一命令標準輸入 | ps aux | grep ssh |
! | 驚嘆號 | 邏輯非、歷史命令展開、正則否定 | if [ $? != 0 ], !!, ls file[!0-9] |
: | 冒號 | 空命令(真)、參數展開檢查、PATH 分隔 | : ${VAR?}, PATH=$PATH:$HOME/bin |
? | 問號 | 通配符匹配單一字元、狀態碼 $? | ls file?.txt, echo $? |
* | 星號 | 通配符匹配任意字元、乘法、參數 $* | ls *.log, let "a=2*3" |
** | 雙星號 | 次方運算、globstar 遞歸匹配 | let "a=2**3" (8), shopt -s globstar |
$ | 美元符 | 變數替換、行尾錨點、參數 $# $@ $$ | echo $VAR, grep 'pattern$' |
${} | 參數展開 | 進階參數操作 | ${var:-default}, ${var//old/new} |
() | 括號 | 子 Shell、陣列定義、命令群組 | (cd /tmp; ls), arr=(a b c) |
(()) | 雙括號 | 算術運算、C 風格判斷 | ((a++)), if ((a>b)) |
[] | 中括號 | 測試命令、陣列索引、字元類別 | [ -f file ], ${arr[0]} |
[[ ]] | 雙中括號 | 增強測試(支援 && || 正則) | [[ $str =~ ^[0-9]+$ ]] |
{} | 大括號 | 代碼塊、大展開、參數界定 | { cmd1; cmd2; }, {a,b,c} |
&& | 邏輯與 | 前命令成功才執行後命令 | cmd1 && cmd2 |
|| | 邏輯或 | 前命令失敗才執行後命令 | cmd1 || cmd2 |
& | 背景執行 | 命令放入背景執行 | sleep 10 & |
\ | 反斜線 | 跳脫字元、續行 | echo \"hello\", cmd \\\n next |
< > | 重導向 | 輸入/輸出重導向 | cmd < in > out |
<< >> | Here-doc/追加 | 內嵌文檔、追加重導向 | cat <<EOF\ntext\nEOF |
$0:腳本名稱;$1~$9、${10}...:位置參數。$*:所有參數視為單一字串;$@:保持各參數獨立(加引號時)。$#:參數個數;$$:當前 Shell PID;$?:上一命令退出碼。${} 進階用法${var:-word} # var 未設定或空時用 word(不修改 var)
${var:=word} # 同上並將 word 賦值給 var
${var:?word} # var 未設定輸出 word 並退出腳本
${var:+word} # var 已設定時用 word,否則空
${var:offset:length} # 子字串
${#var} # 字串長度
${var#pattern} # 刪除最短前綴匹配
${var##pattern}# 刪除最長前綴匹配
${var%pattern} # 刪除最短後綴匹配
${var%%pattern}# 刪除最長後綴匹配
${var/old/new} # 替換首次
${var//old/new}# 替換全部
{}echo file{1,2,3}.txt # file1.txt file2.txt file3.txt
echo {a..z} # a b c ... z
echo {1..10..2} # 1 3 5 7 9 (步進 2)
熟練這些符號,能寫出更符合 Shell 風格、更高效的自動化腳本。