当前位置: 首页 > 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.lryc.cn/news/616094.html

相关文章:

  • 数据结构:栈和队列(Stack Queue)基本概念与应用
  • 从0开始的中后台管理系统-5(userList页面功能实现)
  • JS数组排序算法
  • 第三章 向量
  • ECharts Y轴5等分终极解决方案 - 动态适配缩放场景
  • 计算机网络:(十四)传输层(下)详细讲解TCP报文段的首部格式,TCP 可靠传输的实现与TCP 的流量控制
  • 一些js数组去重的实现算法
  • Android的事件分发流程、Kotlin协程、4大组件、Handler机制、架构设计、性能优化、内存泄漏
  • 系统架构设计师备考之架构设计高级知识
  • Flink提交流程全解析:从模式到实践
  • DevOps:从GitLab .gitlab-ci.yml 配置文件到CI/CD
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼
  • FlinkSQL Joins全解析
  • 从MySQL到大数据平台:基于Spark的离线分析实战指南
  • Spark学习(Pyspark)
  • 在VMware中安装统信UOS桌面专业版
  • 可视化程序设计(4) - 第一个图形窗口程序
  • Python元组
  • 计算XGBoost分类模型的错误率
  • Qt 框架全面解析:从基础到应用
  • 基于C语言(兼容C++17编译器)的记账系统实现
  • CompletableFuture实现Excel sheet页导出
  • RabbitMQ面试精讲 Day 19:网络调优与连接池管理
  • GitHub上为什么采用Gradle编译要多于Maven
  • Excel合并同步工具V1.0
  • Pytorch深度学习框架实战教程10:Pytorch模型保存详解和指南
  • Spring Boot集成WebSocket
  • Spring Boot与WebSocket构建物联网实时通信系统
  • Android Intent 解析
  • Leetcode 3644. Maximum K to Sort a Permutation