變數與資料型別
部分內容由 LLM 生成,尚未經過人工驗證。
Shell 變數宣告、環境變數、陣列與字串操作。
變數宣告與賦值
Shell 變數宣告不需要型別宣告,使用 = 賦值(等號兩側不能有空格):
# 宣告變數
name="Alice"
age=30
path="/usr/local/bin"
# 使用變數(使用 $ 符號)
echo "Name: $name"
echo "Age: ${age}"注意事項:
- 等號兩側不能有空格(
name = "Alice"會錯誤) - 變數名稱區分大小寫
- 慣例上環境變數使用大寫,局部變數使用小寫
環境變數與局部變數
# 局部變數(僅當前 shell)
local_var="local"
# 環境變數(子程序可繼承)
export GLOBAL_VAR="global"
# 查看所有環境變數
env
# 查看特定變數
echo $HOME
echo $PATH
echo $USER陣列
Bash 支援索引陣列和關聯陣列(associative arrays):
# 索引陣列
fruits=("apple" "banana" "cherry")
# 存取元素
echo ${fruits[0]} # apple
echo ${fruits[1]} # banana
# 所有元素
echo ${fruits[@]} # apple banana cherry
echo ${fruits[*]} # apple banana cherry
# 陣列長度
echo ${#fruits[@]} # 3
# 新增元素
fruits+=("date")
# 迭代陣列
for fruit in "${fruits[@]}"; do
echo "$fruit"
done關聯陣列
# 宣告關聯陣列(需要 Bash 4+)
declare -A person
person[name]="Alice"
person[age]=30
person[city]="Taipei"
# 存取
echo ${person[name]} # Alice
# 所有鍵
echo ${!person[@]} # name age city
# 迭代
for key in "${!person[@]}"; do
echo "$key: ${person[$key]}"
done字串操作
字串長度
str="Hello World"
echo ${#str} # 11字串截取
str="Hello World"
# 從位置 0 開始,取 5 個字元
echo ${str:0:5} # Hello
# 從位置 6 開始到結尾
echo ${str:6} # World
# 從右側截取(注意負號前需有空格)
echo ${str: -5} # World字串替換
str="Hello World World"
# 替換第一個匹配
echo ${str/World/Shell} # Hello Shell World
# 替換所有匹配
echo ${str//World/Shell} # Hello Shell Shell
# 刪除匹配(替換為空)
echo ${str//World/} # Hello字串前後綴移除
filename="document.txt"
# 移除後綴
echo ${filename%.txt} # document
# 移除前綴
path="/home/user/file.txt"
echo ${path#/home/} # user/file.txt
# 貪婪移除(最長匹配)
echo ${path##*/} # file.txt(移除所有路徑)參數擴展 (Parameter Expansion)
預設值處理
# 如果 var 未設定或為空,使用預設值
echo ${var:-"default"}
# 如果 var 未設定或為空,設定並使用預設值
echo ${var:="default"}
# 如果 var 已設定且非空,使用替代值
echo ${var:+"alternative"}
# 如果 var 未設定或為空,顯示錯誤訊息
echo ${var:?"variable not set"}大小寫轉換
name="alice"
# 轉大寫
echo ${name^} # Alice(首字母)
echo ${name^^} # ALICE(全部)
# 轉小寫
name="ALICE"
echo ${name,} # aLICE(首字母)
echo ${name,,} # alice(全部)特殊變數
| 變數 | 說明 |
|---|---|
$0 | 腳本名稱 |
$1, $2, ... | 位置參數 |
$# | 參數數量 |
$@ | 所有參數(作為獨立字串) |
$* | 所有參數(作為單一字串) |
$? | 上一個命令的退出碼 |
$$ | 當前 shell 的 PID |
$! | 最後一個背景程序的 PID |
#!/bin/bash
echo "Script name: $0"
echo "First arg: $1"
echo "All args: $@"
echo "Arg count: $#"