變數與資料型別

部分內容由 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: $#"

相關主題