Shell 是使用者與核心溝通的「殼層」,既是命令解譯器,也是功能強大的解釋型程式語言。本文深入解析 Shell 定位、主流家族、命令執行流程、語法結構、萬用字元與內建/外部指令區別,奠定腳本開發基石。
PATH 載入執行bash (Bourne Again Shell) - Linux 預設標準zsh - 功能豐富、Oh My Zsh 生態fish - 使用者友善、開箱即用csh/tcsh - C 風格語法ksh - 企業級 Unix 經典sh (Bourne Shell) - POSIX 標準最小集cd, pwd, echo, exit, export...)→ 直接在 Shell 進程執行$PATH 目錄 → 找到可執行檔 → fork() 子進程 → exec() 載入執行$?),顯示結果command [options] [arguments]
# 範例
ls -al /etc
# command=ls, options=-al, arguments=/etc
-a -l 或合併 -al,長選項 --all --longcmd1; cmd2(循序)、cmd1 && cmd2(前成功才跑後)、cmd1 || cmd2(前失敗才跑後)cmd \arg1 \arg2| 字元 | 匹配規則 | 範例 |
|---|---|---|
* | 任意長度字串(含空) | ls *.txt、cp doc/* /opt |
? | 單一任意字元 | ls file?.txt 匹配 file1.txt, fileA.txt |
[...] | 字元集合/範圍 | ls [abc]*.txt, ls [0-9]*.log |
[!...] | 排除字元集合 | ls [!0-9]*.txt 非數字開頭 |
注意:萬用字元由 **Shell 展開**,而非指令本身處理。指令看到的已是展開後的檔名清單。
type cd # cd is a shell builtin
type ls # ls is /bin/ls
type awk # awk is /usr/bin/awk
cd 變更工作目錄)var=value(僅當前 Shell)export var=value(繼承給子進程)$1~$9, $@, $*, $#$? (退出碼), $$ (PID), $! (背景進程 PID), $0 (腳本名)Shell 是 Linux 系統的「指揮中心」。精通其語法展開順序、內建/外部指令邊界、萬用字元展開機制、變數作用域,是從「會用指令」邁向「寫出健壯腳本、排查疑難雜症」的必經之路。建議以 bash 為主力,配合 shellcheck 靜態分析工具,養成嚴謹腳本開發習慣。