shell脚本数组详解

Shell脚本中的数组是一种用于存储多个值的数据结构,shell支持一维数组和关联数组两种类型。

一、数组类型

‌1、普通数组‌

:普通数组的索引为整数,它从0开始

fruits=("Apple" "Banana" "Cherry")

‌‌2、关联数组

1、关联数组索引可为字符串,定义数组前需先声明数组:declare -A [array]
2、关联数组的元素为 “key”=“value” 形式

declare -A user
user=(["name"]="Alice" ["age"]=25)

二、数组操作

1、访问元素

获取普通数组单个元素:${array[index]} (获取关联数组单个元素:${array[key]})
获取数组所有元素:${array[@]}或${array[*]}

#!/bin/bash
array=("张三" "李四" "王五" "郭六" "邓七" "刘八")
echo "第3个元素是:${array[3]}"      # 从下标0开始计算,它是第4个
echo "数组所有元素1:${array[@]}"
echo "数组所有元素2:${array[*]}"
------------运行结果如下------------
第3个元素是:郭六
数组所有元素1:张三 李四 王五 郭六 邓七 刘八
数组所有元素2:张三 李四 王五 郭六 邓七 刘八

2、获取长度

获取数组元素数量:${#array[@]}
单个元素字符长度:${#array[0]}(0代表第1个元素;1代表第2个元素,以此类推)

#!/bin/bash
array=("张三" "李四" "王五" "郭六" "邓七" "刘八")
echo "数组有几个元素:${#array[@]}"
echo "第3个元素字符长度:${#array[3]}"
------------运行结果如下------------
数组有几个元素:6
第3个元素字符长度:2

3、‌遍历数组‌

使用 for 循环遍历普通数组

#!/bin/bash
array=("张三" "李四" "王五")
for item in "${array[@]}"; do
  echo "$item"
done
------------运行结果如下------------
张三
李四
王五

使用 for 循环遍历关联数组
:关联数组在使用时多个“!”感叹号代表获取key(下标),不加“!”感叹号获取value(值)

#!/bin/bash
declare -A array
array=(["name1"]="张三" ["name2"]="李四" ["name3"]="王五")
for key in "${!array[@]}"; do
  echo "Key: $key, Value: ${array[$key]}"
done
------------运行结果如下------------
Key: name1, Value: 张三
Key: name2, Value: 李四
Key: name3, Value: 王五

4‌、添加与删除‌

增加元素:array[ndex]=value 或者 array+=(value1…valueN)
还有另外的两种添加方式,但个人感觉更加繁琐了,所以不推荐使用,这里不再列出

#!/bin/bash
array=("张三" "李四" "王五" "郭六" "邓七" "刘八")
array[6]="戴9"
echo "数组所有元素:${array[@]}"
------------运行结果如下------------
数组所有元素:张三 李四 王五 郭六 邓七 刘八 戴9

删除元素:unset array[index]

#!/bin/bash
array=("张三" "李四" "王五" "郭六" "邓七" "刘八")
unset array[4]
echo "数组所有元素:${array[@]}"
------------运行结果如下------------
数组所有元素:张三 李四 王五 郭六 刘八

删除整个数组:unset array

#!/bin/bash
array=("张三" "李四" "王五" "郭六" "邓七" "刘八")
unset array
for item in "${array[@]}"; do
  echo "数组所有元素:${item}"  #在ubuntu 24.04.2 LTS中,“数组所有元素:”这些字也没有被输出
done
echo "************"
echo "数组所有元素:${array[@]}"
------------运行结果如下------------
************
数组所有元素:

5‌、切片与替换‌

切片:${array[@]:start:length}
切片详解:获取数组的元素用${array[@]:start:length}来表示,如果没有指定length,那么就从下标start开始获取到最后一个元素;否则从下标start开始获取length个元素

#!/bin/bash
array=("张三" "李四" "王五" "郭六" "邓七" "刘八")
echo ${array[@]:2:3}      # 从下标2开始区3个元素
------------运行结果如下------------
王五 郭六 邓七

临时替换:${array[@]/old/new}
临时替换详解:获取数组的元素用${array[@]/old/new}表示,old代表要被替换的旧元素本身(并非是下标),new代表替换为新元素的本身(并非是下标)

#!/bin/bash
declare -A array
array=(["name1"]="张三" ["name2"]="李四" ["name3"]="王五")
echo ${array[@]/"李四"/"郭六"}
------------运行结果如下------------
张三 郭六 王五

永久替换:需要重新赋值替换后的数组

三、数组操作示例

‌案例1:遍历数组并处理文件

#!/bin/bash
# 定义文件扩展名数组
extensions=("txt" "log" "csv")

# 遍历数组创建空文件
for ext in "${extensions[@]}"; do
  touch "example.$ext"
  echo "创建文件: example.$ext"
done
------------运行结果如下------------
创建文件: example.txt
创建文件: example.log
创建文件: example.csv

‌案例2:‌关联数组存储用户信息

#!/bin/bash
declare -A user
user=(["name"]="Alice" ["age"]=28 ["email"]="alice@example.com")
# 打印所有键值对
for key in "${!user[@]}"; do
  echo "$key : ${user[$key]}"
done
------------运行结果如下------------
email : alice@example.com
age : 28
name : Alice

‌案例3:数组元素筛选与统计

#!/bin/bash
numbers=(15 3 27 42 8 10)
even=()

# 筛选偶数并统计
for num in "${numbers[@]}"; do
  if (( num % 2 == 0 )); then
    even+=($num)
  fi
done

echo "原始数组: ${numbers[@]}"
echo "偶数个数: ${#even[@]}"
echo "偶数列表: ${even[@]}"
------------运行结果如下------------
原始数组: 15 3 27 42 8 10
偶数个数: 3
偶数列表: 42 8 10

‌案例4:命令行参数转数组

#!/bin/bash
# 将输入参数存入数组
args=("$@")
# 打印参数数量和内容
echo "共输入 ${#args[@]} 个参数:"
for arg in "${args[@]}"; do
  echo "- $arg"
done
------------由于我执行时输入89和90这2个参数,所以运行结果如下------------
共输入 2 个参数:
- 89
- 90

‌案例5:数组合并与排序

#!/bin/bash
array1=(3 1 4)
array2=(5 2 6)
merged=("${array1[@]}" "${array2[@]}")
# 排序并输出
sorted=($(printf "%s\n" "${merged[@]}" | sort -n))
echo "合并后排序结果: ${sorted[@]}"
------------运行结果如下------------
合并后排序结果: 1 2 3 4 5 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值