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[@]}"