数组
- 数组中可以存放多个值(bash 只支持一维数组)
- 数组元素的索引从0开始
- 数组在括号内指定数组的值,每个值仅能用空格分割
其中:30为索引0
20为索引1
10为索引2
60为索引3
以此类推,不过注意索引是从0开始的
如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3” (作为一个整体使用)
"$@" 为“1” “2” “3” (分别作为单个的个体使用)
"$#" 为3 (表示参数的数量,也可以叫做长度)不加双引号时与"@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。$*、$@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。
数组定义方法
方法一:
数组名=( [0]=value [1]=value [2]=value …)
举例
方法二:
数组名=( [0]=value [1]=value [2]=value …)
举例:
方法三:
列表名=“value0 valuel value2 …”
数组名=($列表名)
举例:
方法四:
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
举例
数组包括的数据类型
数值类型
字符类型
使用" "或‘ ’定义
获取数组长度
读取某下标赋值
数组遍历
#!/bin/bash
arr5=(1 2 3 4 5)
for i in ${arr5[*]}
doecho $i
done
数组切片
取数组中的某一段的元素的值
格式:
${数组名[@或*]}:起始位置(起始索引):长度
数组替换
永久替换
格式:
$(数组名[@或*]/查找字符/替换字符}
删除数组
使用unset删除数组
删除数组中的某个索引对应的元素的值
追加数组中的元素
在数组中原有的元素后面再追加一些元素
从函数返回数组
调用新数组的元素进行函数运算
加法传参运算
#!/bin/bash
test2 () {abc1=(`echo $@`)sum=0for i in ${abc1[*]}dosum=$[$sum + $i]doneecho "$sum"
}abc=(33 66 99 77 55)test2 ${abc[*]}
乘法传参运算
#!/bin/bash
test3 () {abc1=(`echo $@`)sum=0for ((i=0;i<=$[$# - 1];i++)) #是原始数组的元素个数,这里是取出新数组的>
索引值,不减的话就是一个字符串doabc1[$i]=$[${abc1[$i]} * 2] #这里是将每个原始索引对应的元素值乘以2传到新的数组中对应的索引的元素中去doneecho "${abc1[*]}" #输出新的数组
}abc=(33 66 99 77 55)test3 ${abc[*]}
数组排序算法
冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,
如果满足条件就交换元素值,把较小的元素移动到数组前面,
把大的元素移动到数组后面(也就是交换两个元素的位置) ,
这样较小的元素就像气泡一样从底部上升到顶部
算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,
一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
#!/bin/bash
abc=(33 66 99 44 37) #定义一个数组
echo "原数组的排列顺序为:${abc[*]}"
length=${#abc[*]} #定义原数组的长度为length变量
for ((i=1;i<$length;i++)) #定义排序轮次
dofor ((k=0;k<$length-i;k++)) #确定第一个元素的索引位置dofirst=${abc[$k]} #定义第一个元素的值j=$[$k+1] #定义第二个元素的索引号second=${abc[$j]} #定义第二个元素的值if [ $first -gt $second ] #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换thentemp=$first #把第一个元素的值保存在临时变量temp中abc[$k]=$second #把第二个元素的值赋给第一个元素abc[$j]=$temp #把原第一个元素的值,赋给第二个元素fidone
doneecho "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
直接选择排序
与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。
基本思想:
将指定排序位置与其它数组元素分别对比,
如果满足条件就交换元素值,注意这里区别冒泡排序,
不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换
(如从最后一个元素开始排序) ,
这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
#!/bin/bash
abc=(33 99 77 1024 556 66) #定义一个数组
echo "原数组的排列顺序为${abc[*]}"
length=${#abc[*]} #定义原数组的长度,这里原数组的长度为6for ((i=1;i<$length;i++)) #这里是定义比较的轮数,比较5次
doindex=0 #表示从索引0开始比较for ((k=1;k<=$length-i;k++)) #这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索
引0开始了,所以和0进行比较的范围就是从索引1-5了dofirst=${abc[$k]} #定义与index相比较的索引的取值为firstif [ $first -gt ${abc[$index]} ] #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大
元素的索引位置thenindex=$k#通过比较将较大的数定义到index中,进行下一轮的比较filast=$[$length-$i] #获取在比较的范围中的最后一个元素的索引temp=${abc[$last]} #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中abc[$last]=${abc[$index]} #把最大上面for循环比较出来的最大元素的值赋值给最后一个元素abc[$index]=$temp #把原来最后一个元素的值赋给原来最大值的位置的元素done
doneecho "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
反转排序
以相反的顺序把原有数组的内容重新排序。
基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。
#!/bin/bash
abc=(33 99 lol 77 wegame 1024 6 hello 59)
len=${#abc[*]}
echo "原来的数组排列顺序是:${abc[*]}"
for ((i=0;i<$len/2;i++))
dotemp=${abc[$i]}abc[$i]=${abc[$len-$i-1]}abc[$len-$i-1]=$temp
doneecho "反转后数组的排列顺序是:${abc[*]}"