数组定义方法
方法一:数组名=( value0 value1 value2 ...)
方法二:数组名=([0]=value [1]=value [2]=value...)
方法三:列表名="value0 value1 value2 ..."
数组名=($列表名)
方法四:数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
数组名[3]="value"
...
方法五:脚本定义创建数组
#!/bin/bash
a=0
for i in 10 20 30 40 50
do
pp[$a]=$i
let a++
done
echo ${pp[@]}
删除数组
unset 数组名[下标] #删除某个值
unset 数组名 #删除整个数组
数组包括的数据类型
- 数值类型
- 字符类型
使用“”或‘’定义
输出数组方式:echo ${数组名[@]}或者 echo ${数组名[*]}
通过脚本方式获取数组的值,并判断数组值是否完整
数组切片
数组替换
数组追加元素
方法一:数组名[新下标]=新元素
方法二:数组名[${数组名[@]}]=新元素 ps:此方法必须数组完整
方法三:新数组名=(“${数组名[@]}” “新元素” “新元素”)
双引号不能省略,否则,当数组中存在包含空格的元素时会按空格将元素拆分成多个;
不能将“@”替换为 '*',如果替换,不加双引号时与“@”的表现一致。加双引号时,会将数组中的所有元素作为一个元素添加到数组中
方法四:数组名+=(元素1 元素2 元素3 ...)
向函数传入数组的值
函数名(){
newarr=($@) #函数内通过$@能获取到调用函数时后面跟的所有参数,加上()可以在函数内组成新的数组
........
echo ${new函数[@]}
}
arr=($(函数名 ${arr[@]})) #调用函数后面跟的参数为数组的元素列表表达式
从函数内返回数组
#!/bin/bash
test () {
nerpp=($@) 函数内的数组nerpp的值为数组pp的值
for ((i=0;i<${#nerpp[@]};i++)) i的取值范围
do
nerpp[$i]=$[2 * ${nerpp[$i]}] 新的数组的各个值=原先值*2
done
echo ${nerpp[@]} 输出数组名nerpp的所有值
}
pp=(10 20 30 40 50)
echo "函数外数组值为:${pp[@]}"
#test ${pp[@]}
test1=($(test ${pp[@]})) 新的数组名=(函数test输出的数组nerpp的值)
echo "新的数组值为:${test1[@]}" 新的数组值
数组排序算法
冒泡排序:类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
基本思想:对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部
算法思路:冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一下数组元素,不需要对比同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数排序轮数而减少
#!/bin/bash
arr=(63 4 20 1 3 15)
echo "旧数组的值为:"${arr[@]}
#获取数组的长度
length=${#arr[@]}
#外循环定义比较轮数,比较轮数为数组长度减1,且从1开始
for ((a=1;a<length;a++))
do
#内层循环用来确定比较元素的位置,比较相邻两个元素,较大的元素往后移,并且比较次数会随着比较轮数的增加而减少
for ((b=0;b<length-a;b++))
do
#读取相邻两个元素的前面元素的值
first=${arr[$b]}
#读取相邻两个元素的后面元素的值
c=$[b+1]
second=${arr[$c]}
#相比较两个相邻元素的值大小,如果前面元素值大,则与后面元素交换位置
if [ $first -gt $second ];then
#使用4临时变量保存前面元素的值,实现两个相邻元素交换位置
tmp=$first
arr[$b]=$second
arr[$c]=$tmp
fi
done
done
echo "冒泡排序后的数组的值为:"${arr[@]}