1 概述
-
数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。
-
当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。
2 定义数组
2.1 一维索引数组
方法1
# 定义一个空数组
array=()
# 为数组元素赋值
array1[0]=a
array1[1]=b
array1[2]=c
这会得到一个包含三个元素的数组array1
方法2
array2=(a b c)
元素之间以空格隔开。
2.2 多维数组
数组名[索引1][索引2]=值
或者
数组名[索引1,索引2]=值
2.3 关联数组
关联数组可以使用非数字作为下标,可以是任意字符串
2.3.1 案例:定义一个名为user_info的数组
declare -A user_info
user_info[name]=devops
user_info[age]=18
或者
user_info=([name]=devops [age]=18)
注意:在函数外部定义的关联数组为全局变量,在函数内部定义的关联数组为局部变量
3 操纵数组
3.1 直接获取元素的值及数组的信息
3.1.1 获取单个元素的值
# 获取第一个元素的值
echo ${array1[0]}
> a
# 获取第一个元素的值
echo ${array1[-1]}
> b
3.1.2 获取所有元素的值
echo ${array1[*]}
> a b c
# 或:
echo ${array1[@]}
3.1.3 统计数组的长度
echo ${#array1[*]}
> 3
3.1.4 打印数组的下标值
echo ${!array1[@]}
echo ${!user_info[@]}
3.1.5 删除数组元素和数组
unset array2[2] # 删除索引数组的第三个元素
unset user_info[age] # 删除关联数组中索引为age的元素
unset array2 # 删除数组
3.2 循环遍历数组
3.2.1 方法1:for循环直接取值
for i in "${array1[@]}"
do
echo $i
done
3.2.2 方法2:通过下标取值
for i in ${!array1[@]}
do
echo ${array1[i]}
done
3.2.3 方法3:C语言风格
for((i=0;i<${#array1[@]};i++))
do
echo ${array1[i]}
done
4 FAQ
4.1 $*
和$@
的区别?
4.1.1 当直接通过echo获取数组所有元素时:二者等效
4.1.2 而在循环中它们就有区别了
总结:
${array1[*]}
会将数组元素视为一个整体,而${array1[@]}
将所有数组元素视为独立的个体,推荐使用${array1[@]}
X 参考文献
- shell数组详解 - CSDN
- 《Linux Shell核心编程指南》