当前位置: 首页 > news >正文

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释放内存

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.dtcms.com/a/325020.html

相关文章:

  • OpenEnler等Linux系统中安装git工具的方法
  • DDR中的POD与ODT
  • 分布式事务原理(高并发系统下的数据一致性保障)
  • 一、线性规划
  • 免费数字人API开发方案
  • 高精度计算+快速幂算法
  • 【算法题】:斐波那契数列
  • 【langchain】如何给langchain提issue和提pull request?
  • SpringIoc 实践和应用--XML配置
  • 数据结构-deque(双端队列)和queue(队列)区别
  • Flask多进程数据库访问问题详解
  • spring全家桶使用教程
  • Lua语言元表、协同程序
  • 密码学的数学基础2-Paillier为什么产生密钥对比RSA慢
  • SQL三剑客:DELETE、TRUNCATE、DROP全解析
  • 深度相机---双目深度相机
  • 浏览器CEFSharp+X86+win7 之 浏览器右键菜单(六)
  • Mysql笔记-存储过程与存储函数
  • vulnhub-doubletrouble靶场攻略
  • Linux C文件操作函数
  • 谷歌DeepMind发布Genie 3:通用型世界模型,可生成前所未有多样化的交互式虚拟环境
  • C++移动语义、完美转发及编译器优化零拷贝
  • PostgreSQL 批量COPY导入优化参数配置
  • 近红外与可见光图像融合的多种方法实现
  • OpenAI正式发布GPT-5:迈向AGI的关键一步
  • Java基础-多线程
  • lesson34:深入理解Python线程:从基础到实战优化
  • hysAnalyser --- 支持文件转播UDP/RTP实时流功能
  • CompletableFuture实现Excel 多个sheet页批量导出
  • 【数据分析】循环移位岭回归分析:光遗传学冻结行为模式研究