目录
一、索引(下标)
arr=(1 2 3 4 5)
索引 0 1 2 3 4
二、数组
1、数组定义方法
方法一:
数组名=(value0 value1 value2 ...)
[root@localhost ~]#arr1=(1 2 3 4 5)
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4 5
方法二:
数组名=([0]=value [1]=value [2]=value ...)
[root@localhost ~]#arr1=([0]=1 [1]=2 [2]=3)
[root@localhost ~]#echo ${arr1[*]}
1 2 3
方法三:
列表名="value0 value1 value2 ..."
数组名=($列表名)
[root@localhost ~]#lie="1 2 3 4 "
[root@localhost ~]#arr1=($lie)
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4
方法四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
[root@localhost ~]#arr1[0]="3"
[root@localhost ~]#arr1[1]="2"
[root@localhost ~]#arr1[2]="1"
[root@localhost ~]#echo ${arr1[*]}
3 2 1
2、数组包括的数据类型
- 数值类型
- 字符类型:
使用""或’'定义
[root@localhost ~]#arr1=(1 2 3 4 "sad" 'df')
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4 sad df
3、获取数组长度
echo ${#数组名[*]} 或 echo ${#数组名[@]}
[root@localhost ~]#arr1=(1 2 3 4 5)
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4 5
[root@localhost ~]#echo ${#arr1[*]}
5
4、读取某索引(下标)赋值
echo ${arr1[索引]}
[root@localhost ~]#arr1=(1 2 3 4 5)
0 1 2 3 4
[root@localhost ~]#echo ${arr1[0]}
1
5、数组遍历
[root@localhost ~]#vim arr2.sh
#!/bin/bash
arr2=(1 2 3 4 5)
for v in ${arr2[*]}
do
echo "$v"
done
[root@localhost ~]#. arr2.sh
1
2
3
4
5
6、数组切片
arr=(1 2 3 4 5)
echo ${arr[*]} #输出整个数组 (* @)都有代表整个的意思
echo ${arr[@]}
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5
echo ${arr[*]:0:2} #获取 ${数组名[@或*]:起始位置:长度} 的值
[root@hellozzzq ~]#echo ${arr[*]:0:2}
1 2
#数组arr总长度为5 其中1 2 3 4 5都可以作为起始位置
7、数组替换
arr=(1 2 3 4 5)
echo ${arr[*]/1/100} #与切片有点像,${数组名[@或*]/查找字符/替换字符}
[root@hellozzzq ~]#echo ${arr[*]/1/100}
100 2 3 4 5
#替换后是临时的再次输出数组又会变回原有数组
[root@hellozzzq ~]#arr=(${arr[*]/1/100})
[root@hellozzzq ~]#echo ${arr[*]}
100 2 3 4 5
#重新赋值就可以改变原有数组
8、数组删除
unset arr #删除数组
[root@hellozzzq ~]#unset arr
[root@hellozzzq ~]#echo ${arr[*]}
[root@hellozzzq ~]#
unset arr[2] #删除第三个元素 []输入元素对应的索引
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#unset arr[2]
[root@hellozzzq ~]#echo ${arr[*]}
1 2 4 5
9、数组追加元素
方法一:数组名[索引]=value
#索引选择现有索引范围外的是追加,选择现有索引就是覆盖。
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr[5]=3
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 3
[root@hellozzzq ~]#arr[4]=6
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 6 3
方法二:arr[${#arr[*]}]=value
#现有总长度就是最大索引值加1。
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr[${#arr[*]}]=8
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 8
方法三:arr=("${arr[@]}" value1 … valueN)
#双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个。
#不能将“@”替换为“”,如果替换为“ ”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中。
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr=("${arr[@]}" 10 20 30 40)
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 10 20 30 40
方法四:arr+=(10 20 30 40 50)
#待添加元素必须用“()”包围起来,并且多个元素用空格分隔。
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr+=(10 20 30 40 50)
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 10 20 30 40 50
10、向函数传数组参数
如果将数组变量作为函数参数,函数只会取数组变量的第一个值。
[root@hellozzzq ~]#vim dome13.sh
[root@hellozzzq ~]#. dome13.sh
原始数组值为:1 2 3 4 5
接收到的参数列表:1
新数组的值为:1
[root@hellozzzq ~]#vim dome13.sh
#!/bin/bash
test1 () {
echo "接收到的参数列表:$@"
newarr=$1
echo "新数组的值为:${newarr[*]}"
}
arr=(1 2 3 4 5)
echo "原始数组值为:${arr[*]}"
test1 $arr
解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量
[root@hellozzzq ~]#. dome14.sh
原始数组值为:1 2 3 4 5
新数组的值为:1 2 3 4 5
[root@hellozzzq ~]#vim dome14.sh
#!/bin/bash
test2 () {
newarr=($(echo $@))
echo "新数组的值为:${newarr[*]}"
}
arr=(1 2 3 4 5)
echo "原始数组值为:${arr[*]}"
test2 ${arr[*]}
从函数返回数组
[root@hellozzzq ~]#. dome15.sh
原始数组的值为:1 2 3 4 5
新数组的和为:15
[root@hellozzzq ~]#vim dome15.sh
#!/bin/bash
test2() {
newarr=(`echo $@`)
sum=0
for value in ${newarr[*]}
do
sum=$[$sum + $value]
done
echo $sum
}
arr=(1 2 3 4 5)
echo "原始数组的值为:${arr[*]}"
result1=`test2 ${
arr[*]}`
echo "新数组的和为:$result1"
三、数组排序算法
冒泡排序法
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
初始数组资源 【 20 10 30 60 50 40 】
第一轮 【 20 10 30 50 40 】 60
第二轮 【 20 10 30 40 】 50 60
第三轮 【 20 10 30 】40 50 60
第四轮 【 20 10 】30 40 50 60
第五轮 【 10 】20 30 40 50 60
#!/bin/bash
abc=(20 30 10 60 50 40) #定义数组
length=${#abc[*]} #获取数组长度
#外for循环定义排序轮数
for ((i=1; i<$length; i++))
do
#内for循环找第一个元素的索引
for ((k=0; k<$length-i; k++))
do
first=${abc[$k]}
j=$[$k+1]
second=${abc[$j]}
if [ $first -gt $second ]
then
temp=$first
abc[$k]=$second
abc[$j]=$temp
fi
done
done
echo "排序后数组的排列顺序为${abc[*]}"
直接选择排序
与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。
初始数组资源 【 20 10 30 60 50 40 】
第一轮 【 20 10 30 40 50 】 60
第二轮 【 20 10 30 40 】 50 60
第三轮 【 20 10 30 】 40 50 60
第四轮 【 20 10 】 30 40 50 60
第五轮 【 10 】 20 30 40 50 60
#!/bin/bash
abc=(20 10 30 60 50 40)
length=${#abc[*]}
for ((i=1; i<$length; i++))
do
index=0
for ((k=1; k<=$length-i; k++))
do
first=${abc[$k]}
if [ $first -gt ${abc[$index]} ]
then
index=$k
fi
last=$[$length-$i]
temp=${abc[$last]}
abc[$last]=${abc[$index]}
abc[$index]=$temp
done
done
echo "排序后数组的排列顺序为${abc[*]}"
反转排序
以相反的顺序把原有数组的内容重新排序。
#!/bin/bash
abc=(1 2 3 4 5 6 7)
length=${#abc[*]}
for ((i=0;i<$length/2;i++))
do
temp=${abc[$i]}
abc[$i]=${abc[$length-$i-1]}
abc[$length-$i-1]=$temp
done
echo "${abc[*]}"