目录
Shell数组
数组的表达方式(四种方式)
(30 20 10 60 50 40)
0 1 2 3 4 5 #下标 从0开始
方法一
数组名=(value0 value1 value2 value3 value4 …)
方法二
数组名=([0]=value [1]=value [2] =value...)
下标2缺失的情况下,其他下标所对应的数值可以输出,只有下标2所对应的数值33不能输出
方法三
列表名= "value0 value1 value2..."
数组名=($列表名)
方法四
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
数组包括的数据类型
- 数值类型
- 字符类型
- 使用" "或者' '定义
示例:
获取数组长度
格式:
arr_number=(1 2 3 4 5)
arr_length=${#arr_number[*]}
${#arr_number[@] }
echo $arr_length
示例:数组的长度
获取数据列表
echo ${arr_number[*]}
echo ${arr_number[@]}
读取某下标的赋值
arr_index2=${arr_number[2]}
echo $arr_index2
示例:
数组遍历
#!/bin/bash
arr number=(1 2 3 4 5)
for V in ${arr_number[@]}
do
echo $v
done
示例:先定义数组,在利用for循环在数组中取值
数组切片
arr=(12345)
echo ${arr[@] } #输出整个数组
echo ${arr[@]:0:2} #获取${ 数组名[@或*]:起始位置:长度}的值
echo ${arr1[*]:1:3}
echo ${arr[@] :2:3}
示例:
数组的替换
注意:数组的替换需要谨慎使用,防止替换错误
arr=(12345)
echo ${arr[@]/4/66}#${数组名[@或*]/查找字符/替换字符}
echo ${arr[@]} #并不会替换数组原有内容
arr=(${arr[@]/4/66}) #要实现改变原有数组,可通过重新赋值实现
echo ${arr[@] }
临时替换
永久替换
精确替换
数组的删除
arr=(12345)
unset arr #删除数组
echo ${arr[*]}
arr=(12345)
unset arr [2] #删除第三个元素
echo ${arr[*] }
示例:
数组追加元素(四种方法)
方法一
array_ name [ index] =value
方法二
array_ name[${ #array_ name[@]}]=value
方法三
array_ name= ("${array_ name[@]}" value1 ... valueN)
双引号不能省略,否则,当数组array_ name中存在包含空格的元素时会按空格将元素拆分成多个
不能将“g”替换为“*”, 如果替换为“*", 不加双引号时与“@”的表现一致,加双引号时,会将数组
array_ name中的所有元素作为一个元索添加到数组中
for i in "${array_ name[@]}"; do echo $i; done
当数组中存在包含空格的元素时会按空格将元素拆分成多个
[root@localhost ~]# array5=(${array4[*]})
[root@localhost ~]# echo ${array5[*]}
zhang san li si wang wu zhao liu
[root@localhost ~]# echo ${#array5[*]}
8
不能将"@"替换为"*",如果替换为"*",不加双引号时与"@"的表现一致,加双引号时,会将数组中的所有元素作为一个元素添加到数组中
[root@localhost ~]# array5=("${array4[*]}")
[root@localhost ~]# echo ${array5[*]}
zhang san li si wang wu zhao liu
[root@localhost ~]# echo ${#array5[*]}
1
正确写法:
[root@localhost ~]# array4=("zhang san" "li si" "wang wu" "zhao liu")
[root@localhost ~]# array4=("${array4[@]}" "qian qi" "zhu ba")
[root@localhost ~]# echo ${array4[*]}
zhang san li si wang wu zhao liu qian qi zhu ba
[root@localhost ~]# echo ${#array4[*]}
6
方法四
array_ name+= (value1 . . .valueN)
待添加元素必须用“()"包围起来,并且多个元素用空格分隔
[root@localhost ~]# array4+=("nan jing" "dong tai")
[root@localhost ~]# echo ${array4[*]}
zhang san li si wang wu zhao liu qian qi zhu ba nan jing dong tai
[root@localhost ~]# echo ${#array4[*]}
8
向函数传数组参数
如果将数组变量作为函数参数,函数只会取数组变量的第一个值。
格式:
test1() {
echo "接收到的参数列表:$@"
newarrary=($1)
echo "新数组的值为:${newarrary[*]}"
}
######## main ########
array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]} "
test1 $array
在函数外把数组传递到函数内
函数外
函数名 ${数组名[@] }
使用 ${数组名[@] } 获取数组的列表,在用这个列表作为参数给函数传递
函数内
使用 $@ 接收参数列表,在用 数组名=($@) 在函数内生成一个数组
示例:利用函数获取数组值,并算出数组中所有数的和
从函数返回数组
test3() {
newarrary=(`echo $@`)
sum=0
for S in ${newarrary[*]}
do
sum=$[$sum + $S]
done
echo $sum
}
test4() {
newarrary=(`echo $@`)
for ((i=0; i<=$[$# - 1]; i++))
do
newarrary[$i]=$[${newarrary[$i]} * 2]
done
echo ${newarrary[*]}
}
arr=(10 20 30 40 50)
echo "原始数组的值为:${arr[*]}"
result1=`test3 ${arr[*]}`
echo "新数组的和为:$result1"
示例: