数组定义
数组内数据类型可以为数值也可以为字符串。
若字符串类型需要使用 ' ' " " 包含以免空格扰乱数组。
方法1
空格分隔直接定义数组
arr=(10 20 30 40 50) arr1=('zhangsan' 'lisi' 'wangwu')
方法2
指定元素下标定义,若跳过元素不设置会显示为空
arr=([0]=10 [1]=20 [2]=30 [3]=40 [4]=50)
方法3
字符串左右加上( )转换为数组
str="10 20 30" arr=($list)
方法4
指定元素下标定义,若跳过元素不设置会显示为空
arr[0]=10 arr[1]=20 arr[2]=30
FOR循环快速定义数组
a=0 #下标 for i in 10 20 30 40 50 do array[$a]=$i let a++ done echo ${array[*]}
数组输出
数组的输出不能像变量一样 echo $array ,这样只能输出第一个元素。
echo ${array[*]} echo ${array[@]}
配合awk命令获取列表最后一个元素
echo ${array[*]} | awk '{print $NF}' #输出所有数组内容 $NF筛选最后一个元素 #赋值给变量 last=$( echo ${array[*]} | awk '{print $NF}' )
数组长度统计
echo ${#array[*]} echo ${#array[@]}
若数组中有下标被跳过没有赋值,统计的长度(有值的下标)会与数组总长度不相同!
[xue@xue ~]$ arr1=([0]=10 [1]=20 [2]=30 [3]=40 [4]=50) [xue@xue ~]$ echo ${#arr1[*]} 5 [xue@xue ~]$ arr=([0]=10 [1]=20 [2]=30 [4]=50) [xue@xue ~]$ echo ${#arr[*]} 4
显示有值的数组下标
echo ${!array[*]} echo ${!array[@]}
[xue@xue ~]$ arr=([0]=10 [1]=20 [2]=30 [4]=50) [xue@xue ~]$ echo ${!arr[*]} 0 1 2 4
获取最后一个下标
array=(10 20 30 40 50) #使用分片通配符方式 xiabiao=${!array[*]} #获取全部下标 echo ${xiabiao##* } #从前向后删到剩最后一个下标 #也可以使用AWK获取最后一段的方式 echo ${!array[*]} | awk '{print $NF}'
根据下标获取元素值
echo ${array[0]} echo ${array[1]} echo ${array[2]}
数组遍历
for i in ${array[*]} do echo $i done
数组切片
${arr[@]:下标:长度} 数组切片,获取从数组的某个下标开始的多少个元素
[xue@xue ~]$ array=(a b c d e 1 2 3 4 5) [xue@xue ~]$ echo ${array[*]:6:3} 2 3 4
数组替换
${arr[*]/旧字符/新字符} arr= ( ${arr[*]/旧字符/新字符} ) #重新赋值,写入变量
注意 替换会将所有匹配到的字符都替换掉
并且替换不会对变量重新赋值,只有将替换后的结果重新赋值给变量才能改变变量值
[xue@xue ~]$ array=(10 50 100 150 1000) [xue@xue ~]$ echo ${array[*]/10/666} 666 50 6660 150 66600 array= ( ${array[*]/10/666} ) #重新赋值,写入变量
删除数组
unset array #删除数组 unset array[1] #删除数组下标为1的元素
数组追加元素
方法1
设置指定下标的值
arr[ 下标 ] = 值 arr[ 1 ] = 20
方法2
直接用数组长度作为下标,表示在尾部追加
arr[ 数组长度 ] = 值 arr[ ${#arr[*]} ] = 20
方法3
最简单的方法 arr += 10
arr += (值1 值2 ...) arr += (60 70 80 90 100)
方法4
直接重新定义数组,使用数组原先的值加上需要添加的值
双引号不能省略!
否则在数组arr中带空格的元素(“zhang san”)会被拆分成(“zhang” “san”)
不能将 @ 替换为 * !
${array[*]} ${array[@]}在未加双引号时同义,都表示所有元素
但加双引号时, arr=("${arr[*]}") 会将数组所有元素视为同一个元素添加进数组中arr=("${arr[@]}" "值1" "值2" ...) arr=("${arr[@]}" "100" "200" ...)
向函数传入数组
如果数组变量作为函数参数直接传参,函数只会得到数组第一个值(t1
解决这个问题可以将数组变量值分解为单个的值,然后将这些值作为函数使用。在函数内部,再组合成一个新的数组变量。
- ${array[@]} 拆分为单个值
- ( $@ ) (`echo $@`) $(echo $@) 将传来的值用括号重新组合数组
t1 () { echo "t1接收到的参数列表:$@ " newarray1=($@) #传参方法1 直接用括号包含传来的单个元素重新组成数组 echo "t1新数组的值 ${newarray1[@]} " } t2 () { #传参方法2 (`echo $@`) 或$(echo $@)得到echo执行的结果再用括号包含重新组成数组 echo "t2接收到的参数列表:$@ " newarray2=($(echo $@)) echo "t2新数组的值 ${newarray2[@]} " } array=(10 20 30 40 50) echo "原始数组为 ${array[@]}" #直接传参 数组 只能得到第一个数据 t1 $array t2 $array #分解成单个值重新组合 正常显示 t1 ${array[@]} t2 ${array[@]}
[xue@xue ~]$ sh 12.sh 原始数组为 10 20 30 40 50 t1接收到的参数列表:10 t1新数组的值 10 t2接收到的参数列表:10 t2新数组的值 10 t1接收到的参数列表:10 20 30 40 50 t1新数组的值 10 20 30 40 50 t2接收到的参数列表:10 20 30 40 50 t2新数组的值 10 20 30 40 50
向函数传入数组并从函数返回数组
- ${array[@]} 拆分为单个值
- newarray=(`echo $@`) 、newarray=( $@) 、newarray=($(echo $@)) 传参进去重新组合
- echo ${newarray[*]} 传参出来
result1 = ( ` 函数名 ${array[*]} ` ) 执行结果给参数赋值
t1 () { newarray=(`echo $@`) #重新拼接 sum=0 for value in ${newarray[*]} #求和 do sum=$[$sum + $value] done echo $sum } t2 () { newarray=(`echo $@`) for ((i=0;i<=$[$# -1 ];i++)) #下标从0开始,比计数少1 { newarray[$i]=$[${newarray[$i]} *2 ] #x2 } echo ${newarray[*]} } array=(10 20 30 40 50) echo "原始数组为 ${array[@]}" result1=(`t1 ${array[*]}`) result2=(`t2 ${array[*]}`) echo "新数组的和为 $result1 " echo "新数组的值为 ${result2[*]} "
[xue@xue ~]$ sh 115.sh 原始数组为 10 20 30 40 50 新数组的和为 150 新数组的值为 20 40 60 80 100
冒泡排序
- 大循环根据列表中存在的元素数量循环n次,保证所有元素都能被排序完成
- 小循环从前向后遍历,循环一次循环范围减少一位(由于后面的已经排列完成无需再比较)
- 小循环每次循环向后移一位并进行比较,当遇到比自己小的数交换位置,保证每轮都能获取到最大的数排列到队尾
#!/bin/bash MAOPAO() { arr=($@) #获取数组的长度 length=${#arr[@]} #外层循环用来定义比较轮数,比较轮数为数组长度减1,且从1开始 for ((a=1; a<length; a++)) do #内层循环用来确定比较元素的位置,较比相邻两个元素,较大的元素往后移,并且比较次数会随着比较轮数的增加而减少 for ((b=0; b<length-a; b++)) do #获取相邻两个元素的前面元素的值 first=${arr[$b]} #获取相邻两个元素的后面元素的值 second=${arr[$b+1]} #比较两个相邻元素的值大小,如果前面元素的值较大,则与后面元素交换位置 if [ $first -gt $second ];then #使用临时变量保存前面元素的值,实现两个相邻元素交换位置 tmp=$first arr[$b]=$second arr[$b+1]=$tmp fi done done echo "冒泡排序后的数组的值为: ${arr[@]}" } ##### main ##### read -p "请输入一组列表:" num array=($num) echo "旧数组的值为: ${array[@]}" MAOPAO ${array[@]}
[xue@xue ~]$ sh maopao.sh 请输入一组列表:10 5 9 41 62 4 2 84 6 42 66 旧数组的值为: 10 5 9 41 62 4 2 84 6 42 66 冒泡排序后的数组的值为: 2 4 5 6 9 10 41 42 62 66 84