bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
1 定义数组
bash中数组的定义有很多方式:
- 数组中各元素以空格隔开。
- 所有的元素包括在小括号内。
- 如果字符串中包含了多个空格,那么可以将该字符串转换为数组,具体如下面代码中的方式五。
- SHELL中没有限定数组的大小。
- 定义数组元素时,元素的索引可以不按顺序定义。两个索引中间元素如果没有定义,则默认为空。
具体如下代码所示:
#!/bin/bash
#定义数组
#方式一
array_cmd=(
cd
cmd
dir
ls
)
echo ${array_cmd[*]}
#方式二
array_cmd2=(rm rmdir tar zip)
echo ${array_cmd2[*]}
#方式三
names=([0]=Tom [1]=Jim [2]=Li [8]=Wang)
echo ${names[*]}
echo ${names[3]}
echo ${names[8]}
#方式四
names2[0]=Hua
names2[1]=Ying
names2[2]=Guang
names2[7]=Ri
echo ${names2[*]}
echo ${names2[3]}
echo ${names2[7]}
#方式五
str="liushu yangshu fengshu hualiu"
names3=($str)
echo ${names3[1]}
echo ${names3[*]}
运行结果如下:
cd cmd dir ls
rm rmdir tar zip
Tom Jim Li Wang
Wang
Hua Ying Guang Ri
Ri
yangshu
liushu yangshu fengshu hualiu
2 数组长度
SHELL中的数组,可以用 数组名[*] 或是 数组名[@]来代表整个数组。如下:
#!/bin/bash
name=(wangsan liwu zhangsi qiba jiushi)
echo ${name[*]}
echo ${name[@]}
#打印整个数组的长度
echo ${#name[*]}
echo ${#name[@]}
#打印数组中某个元素的长度
#打印第二个元素的长度
echo ${#name[1]}
echo `expr length ${name[1]}`
#打印第三个元素的长度
echo ${#name[2]}
运行结果如下:
wangsan liwu zhangsi qiba jiushi
wangsan liwu zhangsi qiba jiushi
5
5
4
4
7
3 数组遍历
可以通过索引的方式去打印输出数组元素,也可以不用索引的方式。数组的下标从0开始,具体代码如下:
#!/bin/bash
name=(wangsan liwu zhangsi qiba jiushi)
#按照索引的方式输出
#for循环的条件必须用两个括号括起来,否则运行报错
for((i=0;i<${#name[@]};i++))
do
echo ${name[i]}
done
echo "----------------------"
#不按照索引的方式输出
for i in ${name[*]}
do
echo ${i}
done
运行结果如下:
wangsan
liwu
zhangsi
qiba
jiushi
----------------------
wangsan
liwu
zhangsi
qiba
jiushi
4 数组元素的添加
可以直接通过下标索引更改某个元素的值,也可以通过下标索引给数组添加元素,同样可以将数组进行拼接。如下:
#!/bin/bash
nums=(1 2 3)
echo ${nums[*]}
#通过索引直接更改元素的值
nums[0]=0
echo ${nums[*]}
#通过索引增加元素
nums[3]=10
echo ${nums[*]}
#通过数组和元素的拼接
new=(${nums[*]} 11)
echo ${new[*]}
运行结果:
1 2 3
0 2 3
0 2 3 10
0 2 3 10 11
5 数组切片
数组切片类似于字符串的切片,输出指定的数组。
下标从0开始,如果是负数,则倒数开始计算位置。如下:
#!/bin/bash
nums=(00 11 22 33 44 55)
echo "数组名默认取第一个元素,下标为0"
echo ${nums}
echo "取数组的第一个元素,通过下标获取"
echo ${nums[0]}
echo "输出所有的数组元素"
echo ${nums[*]}
echo "输出下标2后面的所有元素"
echo ${nums[*]:2}
echo "下标从2开始,取2个元素"
echo ${nums[*]:2:2}
echo "下标从0开始,取3个元素"
echo ${nums[*]::3}
echo "从倒数第二个元素开始,取3个元素"
echo ${nums[*]:-2:3}
运行结果:
数组名默认取第一个元素,下标为000
00
取数组的第一个元素,通过下标获取
00
输出所有的数组元素
00 11 22 33 44 55
输出下标2后面的所有元素
22 33 44 55
下标从2开始,取2个元素
22 33
下标从0开始,取3个元素
00 11 22
从倒数第二个元素开始,取3个元素
00 11 22 33 44 55