数组参考
索引数组
# 声明和初始化
fruits=("apple" "banana" "cherry")
declare -a servers=("web1" "web2" "db1")
# 访问元素
echo "${fruits[0]}" # apple
echo "${fruits[-1]}" # cherry(最后一个)
echo "${fruits[@]}" # 所有元素
echo "${#fruits[@]}" # 元素个数:3
echo "${!fruits[@]}" # 所有索引:0 1 2
# 追加元素
fruits+=("date")
# 切片:${array[@]:start:length}
echo "${fruits[@]:1:2}" # 从索引 1 开始取 2 个
# 合并数组
all=("${fruits[@]}" "${servers[@]}")
关联数组(字典)
# 声明关联数组(bash 4+)
declare -A config=(
["host"]="db.example.com"
["port"]="5432"
)
# 访问值
echo "${config["host"]}"
# 获取所有键和值
echo "${!config[@]}" # 键
echo "${config[@]}" # 值
# 检查键是否存在
[[ -v config["host"] ]] && echo "host 已设置"
# 遍历
for key in "${!config[@]}"; do
echo "$key = ${config[$key]}"
done
数组遍历模式
# 基本遍历
for server in "${servers[@]}"; do
echo "检查 $server"
done
# 带索引遍历
for i in "${!servers[@]}"; do
echo "[$i] ${servers[$i]}"
done
# 从文件读取数组(bash 4+)
mapfile -t lines < /etc/hosts
# 从命令输出读取数组
mapfile -t processes < <(ps aux | awk '{print $1}')
Map 与 Filter 模式
# Map:对每个元素变换
numbers=(1 2 3 4 5)
doubled=()
for n in "${numbers[@]}"; do
doubled+=("$((n * 2))")
done
echo "${doubled[@]}" # 2 4 6 8 10
# Filter:保留满足条件的元素
evens=()
for n in "${numbers[@]}"; do
(( n % 2 == 0 )) && evens+=("$n")
done
echo "${evens[@]}" # 2 4