變數與參數
腳本要能重複使用,就不能把路徑與檔名寫死。變數存值,位置參數接使用者在命令列傳進來的東西。
指定與展開
=兩邊不要空格,name = Alice會被當成執行指令name- 取值寫
$name或${name};變數後面還有英文字時必須用大括號:${name}_backup
引號規則(非常重要)
| 寫法 | 行為 |
|---|---|
"$name" |
展開變數,但空白不拆開 |
'$name' |
完全不展開,就是字面上的 $name |
| 沒引號 | 展開後依空白分割,還會做萬用字元 |
幾乎所有變數展開都加雙引號。這能避免檔名有空白時被拆成兩個參數。
命令列參數
#!/usr/bin/env bash
# 用法:./backup.sh 來源 目的
src=${1:?請提供來源路徑}
dest=${2:?請提供目的路徑}
cp -a "$src" "$dest"
| 變數 | 意思 |
|---|---|
$0 |
腳本名稱 |
$1 $2 … |
第 1、第 2 個參數 |
$# |
參數個數 |
"$@" |
所有參數,逐個保留引號(複製參數時用這個) |
"$*" |
所有參數合成一個字串 |
$? |
上一道指令的結束碼,0 代表成功 |
$$ |
目前 shell 的 PID |
${1:?訊息} 在參數沒給時會中止並印訊息,比自己寫一長串 if 更短。
捕捉指令輸出
$(...) 比舊的反引號清楚。指令失敗時,有 set -e 會讓腳本停住;若「沒找到也沒關係」,在後面加 || true 或暫時關掉 -e。
預設值:
PORT 沒設或是空的,就用 8080。
總結
指定不要加空格,展開加雙引號。對外介面用 $1 與 "$@",對內用有意義的變數名。接著用 條件判斷 決定走哪條路。