Shell数组
数组定义方法
方法一:
数组名=(value0 valuel value2 …)
[root@localhost ~]# num=(10 20 30 40 50)
[root@localhost ~]# echo ${num[*]}
10 20 30 40 50
方法二:
数组名=([0]=value [1]=value [2]=value …)
[root@localhost ~]# num=([0]=10 [1]=20 [3]=40 [4]=50 [2]=30 [6]=70)
[root@localhost ~]# echo ${num[*]}
10 20 30 40 50 70
方法三:
列表名="value0 valuel value2 …" 数组名=($列表名)
[root@localhost ~]# num1='60 50 40 30 20 10'
[root@localhost ~]# NUM1=($num1)
[root@localhost ~]# echo ${NUM1[*]}
60 50 40 30 20 10
方法四:
数组名[0]="value" 数组名[1]="value" 数组名[2]="value"
[root@localhost ~]# num2[0]=10
[root@localhost ~]# num2[1]=100
[root@localhost ~]# num2[2]=1000
[root@localhost ~]# num2[3]=10000
[root@localhost ~]# echo ${num2[@]}
10 100 1000 10000
数组包括的数据类型
- 数值类型
- 字符类型:
- 使用 " " 或 ‘ ’ 定义
获取数组长度
[root@localhost ~]# arr_number=(1 2 3 4 5)
[root@localhost ~]# arr_length=${#arr_number[*]} ####或使用 @ 代替 *
[root@localhost ~]# echo $arr_length
5
获取数值列表
[root@localhost ~]# echo ${arr_number[*]}
1 2 3 4 5
[root@localhost ~]# echo ${arr_number[@]}
1 2 3 4 5
读取某下标赋值
[root@localhost ~]# echo ${arr_number[2]}
3
[root@localhost ~]# echo ${arr_number[0]}
1
[root@localhost ~]# echo ${arr_number[6]}
数组遍历
####没有引号时,使用 @ 和 * 的结果相同
[root@localhost ~]# for i in ${num[*]};do echo $i;done 10 20 30 40 50 70 [root@localhost ~]# for i in ${num[@]};do echo $i;done 10 20 30 40 50 70
####当使用双引号时,"*"会将参数作为整体输出,而"@"会将参数分开输出
[root@localhost ~]# for i in "${num[*]}";do echo $i;done 10 20 30 40 50 70 [root@localhost ~]# for i in "${num[@]}";do echo $i;done 10 20 30 40 50 70
数组切片
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]}
1 2 3 4 5
[root@localhost ~]# echo ${arr[@]:0:2}
1 2
[root@localhost ~]# echo ${arr[@]:1:3}
2 3 4
[root@localhost ~]# echo ${arr[*]:1:3}
2 3 4
[root@localhost ~]# echo ${arr[*]:4:3}
5
字符临时替换
[root@localhost ~]# num=([0]=10 [1]=20 [3]=40 [4]=50 [2]=30 [6]=70)
[root@localhost ~]# echo ${num[@]}
10 20 30 40 50 70
[root@localhost ~]# echo ${num[@]/70/60} ####将数组中的70临时替换为60
10 20 30 40 50 60
[root@localhost ~]# echo ${num[@]} ####重新加载后还原
10 20 30 40 50 70
字符永久替换
替换数组当中所有匹配到的字符
[root@localhost ~]# echo ${num[@]}
10 20 30 40 50 70
[root@localhost ~]# num=(${num[@]/70/60})
[root@localhost ~]# echo ${num[@]}
10 20 30 40 50 60
[root@localhost ~]# num=(${num[@]/0/9})
[root@localhost ~]# echo ${num[@]}
19 29 39 49 59 69
[root@localhost ~]#
数组删除
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr ####删除数组当中的所有元素
[root@localhost ~]# echo ${arr[@]}
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr[2] ####删除数组当中某一位的元素
[root@localhost ~]# echo ${arr[@]}
1 2 4 5
数组追加元素
方法一:
array_name [index]=value
[root@localhost ~]# a=(0 1 2 3 4 5 6 7 8 9)
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9
[root@localhost ~]# a[10]=10
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10
方法二:
array_name [${#array_name[@]}]=value
[root@localhost ~]# a[${#a[@]}]=11
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10 11
方法三:
array_name=("${array_name[@]}" value1 … valueN)
[root@localhost ~]# a=("${a[@]}" 12 13 14 15)
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
不能将"@"替换为“*",如果替换为"*",不加双引号时与"@"的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中
for i in "${array_name[@]}"; do echo $i; done
[root@localhost ~]# for i in "${a[@]}";do echo $i;done
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
方法四:
array_name+=(value1 … valueN)
[root@localhost ~]# a+=(16 17 18 19 20)
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
待添加元素必须用“()"包围起来,并且多个元素用空格分隔
向函数传数组参数
如果将数组变量作为函数参数,函数只会取数组变量的第一个值
#!/bin/bash
test1() {
echo "received array: $@"
newarr=($*)
echo "new array: ${newarr[@]}"
}
arr=(10 20 30 40 50)
echo "original array: ${arr[@]}"
test1 $arr

#!/bin/bash
test1() {
echo "received array: $@"
newarr=($*)
echo "new array: ${newarr[@]}"
}
arr=(10 20 30 40 50)
echo "original array: ${arr[@]}"
test1 ${arr[@]}

从函数返回数组
#!/bin/bash
test1() {
echo "received array: $*"
newarr=($@)
sum=0
for i in ${newarr[@]}
do
sum=$[$sum + $i]
done
echo "sum of all parameters in array: $sum"
}
arr=(10 20 30 40 50)
echo "initial array: ${arr[@]}"
test1 ${arr[*]}

#!/bin/bash
test2() {
newarr=(`echo $@`)
length=${#newarr[@]}
for ((i=0; i<$length; i++))
do
newarr[$i]=$[${newarr[$i]} * 2]
done
echo ${newarr[@]}
}
array=(10 20 30 40 50)
echo "initial array: ${array[@]}"
result=(`test2 ${array[@]}`)
echo "new array: ${result[@]}"

浙公网安备 33010602011771号