Shell数组是存储多个值的数据结构,支持索引数组(数字下标)和关联数组(字符串键),常用于批量处理数据。以下是核心知识点及操作示例:
🔢 1. 数组定义与分类
- 索引数组:下标从0开始,元素用空格分隔。
array=("apple" "banana" "cherry") # 直接定义 array[0]="apple" # 逐个赋值
- 关联数组(Bash 4.0+):需先声明,键值对形式。
declare -A assoc_arr # 声明 assoc_arr=([id]=100 [name]="Tom") # 初始化
⚙️ 2. 数组操作
访问元素
- 索引数组:
${array[0]}
- 关联数组:
${assoc_arr["name"]}
- 获取所有元素:
${array[@]}
或${array[*]}
(@
推荐避免空格问题)。
获取长度
echo ${#array[@]} # 输出元素个数
echo ${#array[0]} # 输出第一个元素的字符长度
遍历数组
- 索引数组:
for i in "${array[@]}"; do echo "$i"; done # 遍历值 for i in "${!array[@]}"; do echo "$i: ${array[$i]}"; done # 遍历下标和值
- 关联数组:
for key in "${!assoc_arr[@]}"; do echo "$key: ${assoc_arr[$key]}"; done
增删改查
- 增加元素:
array+=("orange") # 尾部追加 assoc_arr["age"]=25 # 关联数组新增键
- 删除元素:
unset array[1] # 删除索引数组第二个元素 unset assoc_arr["name"] # 删除关联数组键 unset array # 删除整个数组
- 修改元素:
array[0]="grape" # 索引数组修改 assoc_arr["id"]=200 # 关联数组修改
切片与替换
- 切片:
${array[@]:1:2}
# 从下标1开始截取2个元素 - 临时替换:
${array[@]/apple/pear}
# 替换所有匹配值(不修改原数组) - 永久替换:
array=(${array[@]/apple/pear})
🔑 3. 关联数组特有操作
- 声明必须使用
declare -A
。 - 键可以是任意字符串,如:
declare -A colors colors["red"]="#FF0000"
💡 4. 实用技巧
- 数组转函数参数:
func() { local arr=("$@"); echo "${arr[@]}"; } func "${array[@]}" # 传递数组
- 命令结果转数组:
files=($(ls)) # 将ls输出存入数组
- 判断下标是否存在:
if [[ -v array[3] ]]; then echo "下标3存在"; fi
💎 总结
操作 | 索引数组 | 关联数组 |
---|---|---|
声明 | 直接定义 | declare -A 必需 |
访问元素 | ${array[0]} | ${assoc_arr["key"]} |
遍历 | for i in "${array[@]}" | for key in "${!assoc_arr[@]}" |
删除元素 | unset array[1] | unset assoc_arr["key"] |
关联数组需Bash 4.0+(查看版本:
bash --version
)。若需复杂数据处理,可结合循环和条件判断实现排序、过滤等。
通过灵活运用数组,可高效管理批量数据(如日志分析、配置项存储)。建议实操练习以巩固语法细节。