数组基本操作及算法
数组
一、数组定义方法
(10 20 40 60 90 ) #元素
0 1 2 3 4 #对应的索引/下标11
数组下标最大长度:n-1
方法一:
数组名=(value0 value1 value2 ...)
方法二:
数组名=([0]=11 [1]=22 [2]=33 [3]=44 ...)
方法三:
列表名="value0 value1 value2 ..."
数组名=($列表名)
方法四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
数组名[3]="value"
二、数组包括的数据类型
- 数值类型
- 字符类型
- 使用" "或’ '定义,防止元素当中有空格,元素按空格分隔
2.1、获取数组长度
array=(1 2 3 4 5) #定义数组
array=${#arrayr[*]} #获取数组长度
${#array[@]} #获取数组长度
echo $array
2.2、获取数据列表
echo ${array[*] }
echo ${array[@] } .
2.3、读取某下标赋值
lcl=${array[2]}
echo $lcl
2.4、数组遍历
#!/bin/bash
array=(1 2 3 4 5)
for i in ${array[@]}
do
echo $i
done
2.5、数组的切片(分割)
lcl=(1 2 3 4 5 6) #定义数组
echo ${array[@]} #输出整个数组
echo ${array[@]:0:2} #获取 ${数组名[@ 或 *]:起始位置:长度} 的值
echo ${array[@]:2:2}
echo ${array[@]:3:4}
2.6、数组替换
单个替换
多个替换
array=(1 2 3 4 5)
echo ${array[@]/4/bb} #${数组名[@或*]/查找字符/替换字符}
echo ${array[@]} #并不会替换数组原有内容
array=(${array[@]/4/bb}) #要实现改变原有数组,可通过重新赋值实现
echo ${array[@]}
2.7、删除数组
array=(1 2 3 4 5)
unset array #删除数组
echo ${array[*]}
array=(1 2 3 4 5)
unset array[2] #删除第三个元素
echo ${array[*]}
三、数组追加元素
方法一:
array[index]=value
方法二:
在数组未进行删减时,可以使用此方法
array[${#arry[@]}]=value #数组名[数组长度]=数值
方法三:
array=("${array[@]}"value1 ... valueN)
双引号不能省略,否则,当数组array中存在包含空格的元素时会按空格将元素拆分成多个
不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致, 加双引号时,会将数组array中的所有元素作为一个元素添加到数组中
方法四
array+=(valuel ... valueN)
待添加元素必须用"()"包括起来,并且多个元素用空格分隔
四、向函数传数组参数
如果将数组变量作为函数参数,函数只会取数组变量的第一个值
test1 () {
echo "函数中接收到的参数列表: $@"
newarrary=($@)
echo "函数中新数组newarr的值为: ${newarrary[@]}"
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[@]}"
test1 $array
解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。
总结
列表
"10 20 30 40 50 60"
在函数外把数组传递到函数内
函数外
函数名${数组名[@]}
使用${数组名[@]}获取数组的列表,再用这个列表作为参数给函数传递
函数内
使用$@接收参数列表,再用数组名=($@)在函数内生成--个的数组
五、从函数返回数组