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

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.xdnf.cn/news/17456.html

相关文章:

  • Android 四大布局:使用方式与性能优化原理
  • ELK分布式日志采集系统
  • 手写 Spring
  • 《Go小技巧易错点100例》第三十七篇
  • 创建降阶模型用于搅拌槽中的涡流预测
  • 线性代数1000题学习笔记
  • 【机器学习深度学习】Embedding 模型详解:从基础原理到实际应用场景
  • NLP——TF-IDF算法
  • 《从零构建大语言模型》学习笔记4,注意力机制1
  • ADK(Agent Development Kit)【2】调用流程详解
  • 【东枫科技】 FR2 Massive MIMO 原型验证与开发平台,8*8通道
  • NLP学习开始-02逻辑回归
  • 【软件测试】性能测试 —— 工具篇 JMeter 介绍与使用
  • C++高频知识点(十九)
  • 【AI论文】LongVie:多模态引导的可控超长视频生成
  • 嵌套-列表存储字典,字典存储列表,字典存储字典
  • InfluxDB 在物联网设备数据采集与分析中的应用(一)
  • Python爬虫-爬取政务网站的文档正文内容和附件数据
  • 如何解决线上gc频繁的问题?
  • 在Ansys Simplorer中设计三相逆变器,并与Maxwell FEA耦合,实现160kW PMSM
  • Day 10: Transformer完整架构详解 - 从位置编码到编解码器的全面剖析
  • Excel常用功能函数
  • 重学React(四):状态管理二
  • 攻击者瞄准加密技术的基础:智能合约
  • Dify集成 Echarts 实现智能数据报表集成与展示实战详解
  • 第三章-提示词:从0到1,提示词实训全攻略,解锁大语言模型无限潜能(14/36)
  • 深度解析 Spring Boot 循环依赖:原理、源码与解决方案
  • Python vs MATLAB:智能体开发实战对比
  • JavaScript 变量:数据存储的核心机制
  • 生产环境中Spring Cloud Sleuth与Zipkin分布式链路追踪实战经验分享