数组
一、数组的概念
1、定义数组
方法一:
数组名=(value0 value1 value2 …)
方法二:
数组名=([0]=value [1]=value [2]=value …)
方法三:
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
2、数组包括的数据类型
(1)数值类型
(2)字符类型(字符串)
使用" "或''定义,防止元素当中有空格,元素按空格分割
3、索引(下标)
第一个索引始终是数字 0,且添加到数组中的每个后续元素的索引以 1 为增量递增
例如数组abc=(a b c d);第一个数据a的索引就是0,第二个数据b的索引就是1,以此类推。
4、获取数组长度
arr_number=(1 2 3 4 5)
echo ${#arr_number[*]}
5、读取某个下标赋值
arr=(1 2 3 4 5)
echo ${arr[索引值]}
二、对数组进行操作
1、数组遍历
#!/bin/bash
arr5=(1 2 3 4 5)
for i in ${arr5[*]}
do
echo $i
done
2、补充:@和@和*的区别
$@和$*的区别
两者没加""是什么区别
加上""
$* 将数组中的数据作为一个整体使用
$@ 将数组中每个参数分别作为单个的个体使用
$# 显示的是参数的数量,也可称为长度
3、数组切片
arr1=(1 2 3 4 5 6)
echo ${arr1[*]}
echo ${arr1[@]} #输出整个数组,此处*与@相同
echo ${arr1[@]:0:2} #获取 ${数组名[@或*]:起始位置:长度} 的值
4、数组替换
式:${数组名[*或@]/源参数值/将要替换的参数值}
arr2=(1 2 3 4 5)
#临时替换:将数组arr1中的参数值4替换为66,但原来的数组中的参数值并不会改变
echo ${arr2[*]/3/66}
echo ${arr2[*]}
#永久替换:可通过重新赋值实现
arr2=(${arr2[*]/3/66})
echo ${arr2[*]}
5、数组删除
格式:unset 数组名[索引] #删除单个
或unset 数组名 #删除整个数组
#删除单个参数值
arr3=(1 2 3 4 5)
echo ${arr3[*]}
unset arr3[2]
echo ${arr3[*]}
#删除数组
unset arr3
echo ${arr3[*]}
6、数组追加
方法一:单个添加,需要知道数组中有多少参数,以及没有对数组进行任何删减
arr4=(1 2 3 4 5 6 7)
echo ${arr4[*]}
arr4[7]=8 #指定索引添加参数
echo ${arr4[*]}
方法二:直接获取源数组的全部元素再加上新要添加的元素,一并重新赋予该数组,重新刷新定义索引,可以避免中间有删减的情况
arr4=(1 2 3 4 5 6 7)
echo ${arr4[*]}
arr4=("${arr4[@]}" 8 9 10) #加上新参数重新定义数组
echo ${arr4[*]}
方法三:待添加元素必须用“()”包围起来,并且多个元素用空格分隔
arr4=(1 2 3 4 5 6 7)
echo ${arr4[*]}
arr4+=(10 11 12) #添加参数,这种方法用的比较多
echo ${arr4[*]}
7、数组传参给函数
#!/bin/bash
test1 () {
echo "接受到的参数列表:$@"
newarrary=$1
echo "新数组的值为:${newarrary[*]}"
}
array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
test1 $array #将数组变量作为函数的参数,只会取数组变量的第一个值
解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量
test2() {
newarrary=($(echo $@))
echo "新数组的值为:${newarrary[*]}"
}
array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
test2 ${array[*]}
#!/bin/bash
qiuhe () {
arr1=(`echo $@`)
sum=0
for i in ${arr1[*]}
do
sum=$[$sum + $i]
done
echo "数组内相加结果为:$sum"
}
chengfa () {
arr2=(`echo $@`)
for ((i=0;i<=$[$# - 1];i++))
do
arr2[$i]=$[${arr2[$i]} * 2]
done
echo "乘法运算后的数组为:${arr2[*]}"
}
arr=(3 2 1 4 5)
test2 ${arr[*]}
test3 ${arr[*]}
三、冒泡排序
每次对比,确定最后一位【所以我数组长度需要-1】
#!/bin/bash
array=(90 70 82 100 30 66) #定义数组
echo "old_array:${array[*]}" #1.代表排序前的数组
lt=${#array[*]} #数组长度
#定义比较轮数,比较轮数为数组长度-1,从1开始
for ((i=1;i<=$lt;i++))
#当下标为0时for ((i=0;i<$lt;i++))
do
#确定比较元素的位置,比较相邻的两个元素,较大的数往后放,在比较次数谁比较轮数而减少
for ((j=0;j<$lt-i;j++))
do
#定义第一个元素的值
first=${array[$j]}
#定义第二个元素的值
k=$[$j+1]
second=${array[$k]}
#如果第一个元素比第二个元素大,就互换
if [ $first -gt $second ];then
#把第一个元素的值保存到临时变量中
temp=$first
#把第二个元素赋值给第一个元素
array[$j]=$second
#把临时变量赋值给第二个元素
array[$k]=$temp
fi
done
done
echo "new_array:${array[*]}"