Shell脚本-数组定义
一、前言
在 Linux Shell 脚本编程中,数组(Array) 是一种非常实用的数据结构,它可以用来存储多个值,并通过索引进行访问。虽然 Shell 不像 Python 或 Java 那样拥有强大的数据结构支持,但 Bash 提供了对一维数组的基本支持,足以满足大多数自动化脚本的需求。
本文将详细介绍 Shell 脚本中数组的定义方式、初始化方法、访问技巧以及常见问题,帮助你快速掌握 Shell 数组的使用。
二、Shell 数组的基本概念
- ✅ 只支持一维数组:Bash 不支持多维数组。
- ✅ 索引从 0 开始:与大多数编程语言一致。
- ✅ 动态长度:无需预先声明大小,可动态添加元素。
- ✅ 支持字符串和数字:数组元素可以是任意字符串或数值。
⚠️ 注意:Shell 数组仅在 Bash 环境下有效,部分旧版
sh
可能不支持。
三、数组的定义与初始化
1. 方式一:使用括号直接赋值(最常见)
fruits=("apple" "banana" "cherry")
这是最常用的定义方式,用空格分隔元素,整个列表用括号 ()
包裹。
2. 方式二:指定索引赋值
fruits[0]="apple"
fruits[1]="banana"
fruits[2]="cherry"
这种方式适合动态添加元素,或者跳过某些索引。
3. 方式三:混合定义(带索引的数组)
arr=([0]="first" [2]="third" [5]="sixth")
这种写法允许你跳过中间索引,适用于稀疏数组场景。
4. 方式四:从命令输出初始化数组
files=($(ls *.txt))
这会将当前目录下所有 .txt
文件名存入数组 files
中。
⚠️ 注意:文件名含空格时可能出错,建议配合
readarray
使用。
更安全的方式:
readarray -t files < <(ls *.txt)
四、访问数组元素
1. 访问单个元素
echo "${fruits[0]}" # 输出: apple
echo "${fruits[1]}" # 输出: banana
✅ 建议使用
${}
和双引号包裹,避免空格问题。
2. 获取所有元素
echo "${fruits[@]}" # 输出所有元素
echo "${fruits[*]}" # 同上,但作为单个字符串处理
推荐使用 @
,因为它能正确保留每个元素的边界。
3. 获取数组长度
echo "${#fruits[@]}" # 输出数组元素个数
echo "${#fruits[0]}" # 输出第一个元素的字符长度
4. 获取所有索引
echo "${!fruits[@]}"
输出:0 1 2
(即所有有效索引)
五、数组的增、删、改操作
1. 添加元素(追加)
fruits+=("orange")
也可以一次添加多个:
fruits+=("grape" "kiwi")
2. 修改元素
fruits[1]="mango"
直接通过索引重新赋值即可。
3. 删除元素
unset fruits[1]
删除后该索引位置变为空,后续遍历时需注意。
❌ 不能使用
fruits[1]=""
,这只会清空值但保留索引。
4. 删除整个数组
unset fruits
六、实际应用示例
示例:遍历数组并打印
#!/bin/bashfruits=("apple" "banana" "cherry")for fruit in "${fruits[@]}"; doecho "水果: $fruit"
done
示例:处理命令输出结果
#!/bin/bash# 将进程名包含 ssh 的 PID 存入数组
pids=($(ps aux | grep ssh | grep -v grep | awk '{print $2}'))echo "找到 ${#pids[@]} 个 SSH 进程:"
for pid in "${pids[@]}"; doecho "PID: $pid"
done
七、注意事项与常见问题
问题 | 原因 | 解决方法 |
---|---|---|
元素含空格被拆分 | 未加引号 | 使用 "${arr[@]}" |
@ 和 * 区别不清 | 不理解两者行为差异 | 多数情况使用 @ |
索引越界访问 | 访问不存在的索引 | 先判断长度 ${#arr[@]} |
sh 不支持数组 | 使用了非 Bash 解释器 | 使用 #!/bin/bash 开头 |
动态赋值失败 | 语法错误 | 确保格式正确,如 arr+=("value") |
八、总结对比表
操作 | 语法 | 说明 |
---|---|---|
定义数组 | arr=(val1 val2) | 推荐方式 |
指定索引赋值 | arr[0]=val | 动态添加 |
访问所有元素 | "${arr[@]}" | 推荐使用 |
获取数组长度 | "${#arr[@]}" | 元素个数 |
获取索引列表 | "${!arr[@]}" | 所有有效索引 |
添加元素 | arr+=("new") | 追加方式 |
删除元素 | unset arr[0] | 彻底删除 |
删除整个数组 | unset arr | 释放内存 |
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!