shell中的数组
列表的表达方式
“10 20 30 40 50 …”
数组的定义方法
数组的表达方式
表达方式(元素) (20 40 50 10 100 60 …)
索引下标 0 1 2 3 4 5 …
方法一:
数组名=(value0 value1 value2 value3 value4 …)
array=(10 20 30 40 50)
方法二:
数组名=([0]=value [1]=value [2]=value …)
[]内代表元素的下标,可以精确的控制每个元素的值
array1=([0]=11 [1]=12 [2]=13 [3]=14 [4]=15 )
方法三:
列表名=“value0 value1 value2 value3…”
数组名=($列表名)
liebiao="12 34 55 66 11 25"
array2=($liebiao)
方法四:
数组名[0]=“value”
数组名[1]=“value1”
数组名[2]=“value2”
数组名[3]=“value3”
array3[0]=10
array3[1]=14
array3[2]=16
array3[3]=17
array3[4]=11
array3[5]=12
数组的输出
array=(10 20 30 40 50)
echo ${array[*]}
#获取整个数组
echo ${array[@]}
#获取整个数组
echo ${#arrary[*]}
#获取数组的长度
echo ${arry[2]}
#获取数组中某个下标的值
用for来检查数组是否完整
array1=([0]=11 [1]=12 [2]=13 [3]=14 [5]=15 )
length=${#array[*]}
echo $length
for ((i=0; i<=$length; i++))
do
echo ${array[$i]}
echo "第 ${$i+1} 个元素的值为:${array[$i]}"
done
数组包括的数据类型
- 字符类型(使用 “” 或者 ‘’ 来定义)
- 数值类型
数组的切片(分割)
${i:num:length} #对数值列表进行切片
echo ${array[*]:1:3}
#对数组进行切片*代表全数组,1表示从下标1开始,3表示切片长度为3
数组值的替换
echo ${array[*]/30/60}
#注替换的是所有对应字符,元素内有相应字符也会被替换,且只替换匹配到的第一个字符,且为临时替换。
array=(${array[*]/10/60})
#永久替换,直接重新定义
array[2]=100
#精确替换某个元素的值
数组的删除
array=(11 2 3 5 66 77)
unset array
# 删除数组
unset array[1]
# 删除数组中对应下标的元素值
数组追加元素
方法一
array=(11 2 3 5 6 78)
array[6]=70
#追加下标和值
方法二
array=(11 2 3 5 6 78)
array[${#array[*]}]=70
#按照数组长度往后追加
array1=([0]=11 [1]=12 [3]=14 [4]=15 )
array[${#array[*]}]=70
#若数组缺值,那么追加的值会覆盖上一个值
方法三
array=("${array[@]}" value1 ....valuen)
#直接重新定义数组,""不能少,不然当数组中存在含space的值时,数组会将其拆分
#不能将"@"替换为"*",@会将数组中的值当成个体存在,而*会将其中的值当成一个整体看待。
方法四
array+=(....)
# 待添加元素必须用"()"包围起来,并且多个元素用空格分隔
向函数传数组参数
如果将数组变量作为函数参数,函数只会取数组变量的第一个值。
test1(){
echo "接收到的参数列表:$@"
newarrary=($1)
echo "新数组的值为: ${newarrary[*]}"
array=(3 2 1 4 5)
echo "原始数组的值为:|${array[* ] }"test1 $array
向函数传数组参数步骤
#在函数外把数组传递到数组内
函数名 ${数组名[@]}
# 获取数组的列表,再使用这个列表作为参数给函数传递
#函数内部
使用 $@ 接收参数列表
在用数组名=($@) 在函数内生成一个新的数组
#利用函数获取数组值,并算出数组中所有数的和
#!/bin/bash
test2() {
newarray=($@)
#echo "函数中新数组的值为: ${newarray[@]}"
sum=0
for v in $(echo ${newarray[@]})
do
let sum+=$v
done
echo $sum
}
############# main ##########
array=(10 20 30 50 60)
#echo "原数组array的值为: ${array[@]}"
#test2 ${array[@]}
res1=$(test2 ${array[@]})
echo "和为 $res1"
#!/bin/bash
#输入一个列表,求出列表中所有数的和
test1() {
newarr=($@)
sum=0
for v in $(echo ${newarr[@]})
do
let sum+=$v
done
echo $sum
}
######## main ########
read -p "请输入需要相加的列表:" list
arr=($list)
echo "原数组arr的值为:${arr[@]}"
res1=$(test1 ${arr[*]})
echo "函数中新数组的所有元素的累加和为:$res1"
[root@localhost ~]# bash array.sh
请输入需要相加的列表:10 20 30 40 50
原数组arr的值为:10 20 30 40 50
函数中新数组的所有元素的累加和为:150
#利用函数获取数组值,并算出所有数的翻倍
#!/bin/bash
test1() {
newarr=($@)
length=${#newarr[*]}
for ((i=0; i<$length; i++))
do
newarr[$i]=$[${newarr[$i]} * 2]
done
echo "${newarr[*]}"
}
######## main ########
read -p "请输入需要相加的列表:" list
arr=($list)
echo "原数组arr的值为:${arr[@]} "
res1=($(test1 ${arr[*]}))
echo "函数中新数组的所有元素的翻倍后为:${res1[*]}"
[root@localhost ~]# bash array.sh
请输入需要相加的列表:10 20 30 40 50
原数组arr的值为:10 20 30 40 50
函数中新数组的所有元素的翻倍后为:20 40 60 80 100