跳轉到

建立 2026-09-14 更新 2026-09-14

變數與參數

腳本要能重複使用,就不能把路徑與檔名寫死。變數存值,位置參數接使用者在命令列傳進來的東西。

指定與展開

name="Alice"
echo "Hello, ${name}"
  • = 兩邊不要空格,name = Alice 會被當成執行指令 name
  • 取值寫 $name${name};變數後面還有英文字時必須用大括號:${name}_backup
files=*.txt
echo $files      # 可能被拆成多個字
echo "$files"    # 當成一個字串

引號規則(非常重要)

寫法 行為
"$name" 展開變數,但空白不拆開
'$name' 完全不展開,就是字面上的 $name
沒引號 展開後依空白分割,還會做萬用字元

幾乎所有變數展開都加雙引號。這能避免檔名有空白時被拆成兩個參數。

filename="my notes.txt"
cp "$filename" /tmp/

命令列參數

#!/usr/bin/env bash
# 用法:./backup.sh 來源 目的
src=${1:?請提供來源路徑}
dest=${2:?請提供目的路徑}
cp -a "$src" "$dest"
變數 意思
$0 腳本名稱
$1 $2 第 1、第 2 個參數
$# 參數個數
"$@" 所有參數,逐個保留引號(複製參數時用這個)
"$*" 所有參數合成一個字串
$? 上一道指令的結束碼,0 代表成功
$$ 目前 shell 的 PID

${1:?訊息} 在參數沒給時會中止並印訊息,比自己寫一長串 if 更短。

捕捉指令輸出

today=$(date +%F)
count=$(grep -c error app.log || true)

$(...) 比舊的反引號清楚。指令失敗時,有 set -e 會讓腳本停住;若「沒找到也沒關係」,在後面加 || true 或暫時關掉 -e

預設值:

port=${PORT:-8080}

PORT 沒設或是空的,就用 8080。

總結

指定不要加空格,展開加雙引號。對外介面用 $1"$@",對內用有意義的變數名。接著用 條件判斷 決定走哪條路。