shell编程中数组的概念与使用详解
1. shell数组的概念
shell数组:是若干数据的集合,其中的每一份数据都称为元素
shell不限制数组的大小,理论上可以存放无限量的数据,shell数组元素的下标也是从0开始计数
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;下标必须大于等于0
遗憾的是,常用的Bash shell只支持一维数组,不支持多维数组
2. 数组的定义
shell中,用小括号( )来表示数组,数组元素之间用空格来分隔
2.1 用小括号将变量值括起来赋值给数组变量
每个变量值之间要用空格进行分隔
赋值号=两边不能有空格,必须紧挨着数组名和数组元素
array1=(1 2 3 4 5)
echo ${array1[*]} #输出定义数组的所有元素
echo ${array1[@]} #输出定义数组的所有元素
echo ${array1[0]} #输出定义数组的第一个元素
echo ${array1[1]} #输出定义数组的第二个元素
echo ${array1[2]} #输出定义数组的第三个元素
2.2 采用键值对的形式赋值
用小括号将变量值括起来,同时采用键值对的形式赋值
array2=([1]=one [2]=two [3]=three)
echo ${array2[*]} #输出定义数组的所有元素
echo ${array2[@]} #输出定义数组的所有元素
echo ${#array2[@]} #输出定义数组的个数
echo ${array2[1]} #输出定义数组中键为1的元素
2.3 通过分别定义数组变量的方法来定义
array3[1]=a
array3[2]=b
array3[3]=c
echo ${array3[@]}
echo ${array3[1]}
echo ${array3[2]}
2.4 动态地定义数组变量
动态地定义数组变量,并使用命令的输出结果作为数组的内容
mkdir /array/ -p
touch /array/{1..5}.txt
ls /array
array4=($(ls /array))
echo ${array4[*]}
echo ${array4[@]}
echo ${#array4[*]}
echo ${#array4[@]}
3. 数组的打印
- 打印单个数组元素: ${数组名[下标]} 。当未指定数组下标时,下标默认从0开始
- 打印全部数组内容:${数组名[@]}或 ${数组名[*]}
- 打印数组元素的个数:${#数组名[@]}或 ${#数组名[*]}
4. 数组的赋值
如果下标不存在,则自动添加一个新的元素;如果下标存在,则覆盖原来的值
array2=([1]=one [2]=two [3]=three)
echo ${array2[@]}
echo ${array2[0]}
array2[0]=hello
echo ${array2[0]}
echo ${array2[@]}
array2[4]=hello
echo ${array2[@]}
array2[4]=word
echo ${array2[@]}
5. 数组的删除
因为数组本质上还是变量,因此可以通过 unset 数组[下标] 删除相应的数组元素
删除整个数组:unset 数组
array2=([1]=one [2]=two [3]=three)
echo ${array2[@]}
unset array2[1]
echo ${array2[@]}
unset array2
echo ${array2[@]}
6. 数组内容的截取和替换
6.1 截取
echo ${数组名[@]:start:length} #start代表从第几个下标开始截取,length表示截取的长度
例:
array1=(1 2 3 4 5)
echo ${array1[@]}
echo ${array1[@]:1:3}
echo ${array1[@]:0:2}
array2=($(echo {a..z}))
echo ${array2[@]}
echo ${array2[@]:0:2} #从下标0开始截取2个
echo ${array2[@]:5:10} #从下标5开始截取10个
6.2 替换
echo ${数组名[@]/要替换的元素/替换成什么}
例:
array2=(1 2 3 1 1 1)
echo ${array2[@]}
echo ${array2[@]/1/a}
echo ${array2[@]/2/b}
echo ${array2[@]}
注意:替换完以后,原数组的内容不会改变