数组及排序
一、数组的表示方法
- 数值类型
- 字符类型:用“ ”或’ '定义
1. 方法一:
数组名=(value0 value1 value2 ...)
2. 方法二:
数组名=([0]=value [1]=value [2]=value ...)
3. 方法三:
列表名="value0 value1 value2 ..."
4. 方法四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
二、获取数组相关信息
1. 获取数组长度
echo ${#数组名[@]}
2. 获取数组列表
echo ${数组名[@]}
3. 读取某个位置的数组
echo ${数组名[i]} i代表数组中第i个数值,按照0、1、2 ...排序
三、对数组的操作
1. 数组遍历
$@与$*的区别:不加""无区别,加""区别如下:
2. 数组切片
3. 数组替换
4. 数组删除
5. 数组追加元素
5.1 方法一
直接定义索引位置添加元素
5.2 方法二
在数组后面追加元素
1、只能追加一个元素:
2、可追加多个元素:
加" "时, ∗ 与 *与 ∗与@的区别:
5.3 方法三
四、向函数传数组参数
#!/bin/bash
a(){
echo "函数接收到的值为:$@"
newarray=$@
echo "新数组的值为:${newarray[@]}"
}
array=(10 20 30 40 50)
echo "arrary数组的值为:${array[@]}"
a ${array[@]}
五、从函数返回数组
#!/bin/bash
test1(){
newarray=(`echo $@`)
sum=0
for value in ${newarray[@]}
do
sum=$[$sum + $value]
done
echo $sum
}
test2(){
newarray=(`echo $@`)
for ((i=0;i<=$[$# - 1];i++))
do
newarray[$i]=$[${newarray[$i]} * 2]
done
echo ${newarray[@]}
}
array=(5 3 1 2 4)
echo "原数组值为:${array[@]}"
result1=`test1 ${
array[@]}`
echo "新数组的和为:$result1"
result2=(`test2 ${
array[@]}`)
echo "新数组值为:${result2[@]}"
六、数组排序
1. 冒泡排序
#!/bin/bash
read -p "输入需要排序的数组:" b
array=($b)
echo "旧数组为:${array[@]}"
#获取数组长度
length=${#array[@]}
for ((i=1;i<$length;i++))
do
#确定数值位置,大的往后放,并且比较次数随着轮数增加而减少
for ((a=0;a<$length-$i;a++))
do
#定义第一个和第二个比较的数值
first=${array[$a]}
second=${array[$a+1]}
if [ $first -gt $second ];then
#把第一个数值赋予给一个临时变量temp
temp=${array[$a]}
#把第二个数值赋予给第一个数值
array[$a]=${array[$a+1]}
#再把第一个数值的值(临时变量temp)赋予给第二个数值
array[$a+1]=$temp
fi
done
done
echo "排序后的数组顺序为:${array[@]}"
2. 直接选择排序
#!/bin/bash
arr=(20 30 10 60 40 50)
echo "原数组的值为:${arr[@]}"
length=${#arr[@]}
#定义排序轮数
for ((a=1;a<$length;a++))
do
#假设索引为0的元素是最大的
index=0
#定义和第一个元素比较的索引,来确定最大的元素索引
for ((b=1;b<=$length-$a;b++))
do
#定义最大的元素的值
max=${arr[$index]}
#定义从索引1开始比较的元素的值
element=${arr[$b]}
#判断如果从索引1开始比较的元素的值大于当前最大元素的值,就记录最大值的索引到index
if [ $element -gt $max ];then
index=$b
fi
done
#定义每一轮比较的最后一个元素的索引
last=$[$length-$a]
#把当前轮次的最后一个元素的值赋给临时变量temp
temp=${arr[$last]}
#把最大的值赋给当前轮次的最后一个元素
arr[$last]=${arr[$index]}
#把temp里的原来最后一个元素的值赋给原最大值所在索引的元素
arr[$index]=$temp
done
echo "排序后的数组为:${arr[@]}"
3. 反转显示
#!/bin/bash
arr=(1 2 3 4 5)
length=${#arr[@]}
for ((i=0;i<$length/2;i++))
do
temp=${arr[$i]}
arr[$i]=${arr[$length-$i-1]}
arr[$length-$i-1]=$temp
done
echo ${arr[@]}