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