Shell 不僅是命令解譯器,更是一門完整的程式設計語言,提供變數、參數、流程控制、函式等機制,被廣泛用於系統自動化、部署腳本、日誌分析等場景。本文系統整理 Shell 的五大變數類型、參數置換、常用預定義變數與基本語法,為撰寫健壯的 Shell Script 打好基礎。

VAR_NAME=value(等號兩邊**不可有空格**)$VAR_NAME 或 ${VAR_NAME}$((...))、let 或 bc。MY_VAR),區別於系統變數與指令。Shell 啟動時由系統預定義,影響執行環境。常用:
| 變數 | 用途 |
|---|---|
HOME | 使用者家目錄絕對路徑 |
PATH | 指令搜尋路徑(冒號分隔) |
TERM | 終端機型態 |
UID | 當前使用者 ID |
PWD | 當前工作目錄(隨 cd 變化) |
PS1 | 主提示字元(root 為 #,一般用戶為 $) |
PS2 | 續行提示字元(預設 >) |
用戶可重新定義(如 PATH=$PATH:/opt/bin),以 export VAR 匯出供子行程繼承。
MY_VAR="hello world" # 含空格須加雙引號
readonly MY_VAR # 唯讀,後續不可修改
export MY_VAR # 匯出為環境變數
export NEW_VAR="value" # 定義並匯出一步完成
腳本執行時傳入的參數:$1、$2... $9、${10}...
$0 為腳本檔名本身(非位置參數)。
$# 參數個數;$* 或 $@ 所有參數內容。
| 變數 | 含義 |
|---|---|
$? | 上一指令結束碼(0 成功,非 0 失敗) |
$$ | 當前 Shell 進程 PID(常用於暫存檔命名 /tmp/myscript.$$) |
$! | 最後一個背景進程 PID |
$0 | 當前執行的腳本/指令名稱 |
| 語法 | 行為 |
|---|---|
${VAR:-word} | VAR 已設定且非空則用其值,否則用 word(不改變 VAR) |
${VAR:=word} | VAR 未設定或為空則將 word 賦給 VAR,再用其值(位置參數不可用) |
${VAR:?word} | VAR 未設定則輸出 word 並退出腳本(常用於錯誤檢查) |
${VAR:+word} | VAR 已設定則用 word,否則不置換(留空) |
# if-else
if [ condition ]; then ...; elif [ condition ]; then ...; else ...; fi
# case
case $VAR in
pattern1) ... ;;
pattern2) ... ;;
*) ... ;;
esac
# for 迴圈
for i in list; do ...; done
for ((i=0; i<10; i++)); do ...; done
# while / until
while [ condition ]; do ...; done
until [ condition ]; do ...; done
my_func() {
local local_var="only here" # 區域變數
echo "arg1=$1, arg2=$2"
return 0
}
my_func "hello" "world"
#!/bin/bash(或 #!/usr/bin/env bash)。set -euo pipefail:遇錯即停、未定義變數報錯、管線任一失敗即判定失敗。shellcheck 靜態分析腳本。${VAR},避免歧義。掌握上述核心概念,即可編寫結構清晰、錯誤可控、可維護的 Shell 腳本,大幅提升運維自動化效率。