(1)数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组)。
(2)数组元素的下标由0开始。
(3)Shell数组用括号来表示,元素用“空格”符号分割开。
(4)在shell语句中,使用遍历数组的时候,数组格式要写成 ${arr[@]} 或 $ {arr[*]} 。
数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用哦!
(1)普通数组:不需要声明直接定义,下标索引只能是整数;
(2)关联数组:需要用declare -A 声明否则系统不识别,索引可以是字符串。
(1) 直接把要加入数组的元素用小括号括起来,中间用空格分开。
nu=(22 33 44 55)
(2)精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续 。
num=([0]=77 [1]=55 [2]=33 [3]=99)
(3)先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组。
lisi="11 22 33 44"
num=($lisi)
(4)可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素。
num=(`cat /etc/passwd`)
[root@localhost ~]# echo ${#num[*]}
111
[root@localhost ~]# echo ${num[0]}
root:x:0:0:root:/root:/bin/bash
注意以下特殊方式:
[root@localhost ~]# list[0]=1 //没有定义数组之前也可这样直接定义元素
[root@localhost ~]#
[root@localhost ~]# echo ${list[*]}
1
[root@localhost ~]# list=([0]=1 [1]=2 [3]=4) //定义数组时所以可以是不连续的
[root@localhost ~]# echo ${list[*]}
1 2 4
[root@localhost ~]# echo ${!list[*]} //没有2这个索引,数组元素为3
0 1 3
[root@localhost ~]# ff=(1 2 zhangsan lisi) //不是同一数据类型的也可定义为一个数组
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo ${ff[*]}
1 2 zhangsan lisi
如:arr=(11 22 33 44)
数组名称:arr
数组元素:11,12,12,14,数组元素默认是以空格分隔的
数组长度:4,有4个元素
数组下标:每个数组元素都有一个下标索引,一般从0开始,33是数组第三个元素,但是它的下标索引是2
1.数组的常用操作以及经典案例
(1)读取数组和元素
[root@localhost ~]# fruit=(apple banana orange) //定义了一个水果的数组
[root@localhost ~]# echo ${#fruit[*]} //查看这个数组元素的个数,也是数组长度
3
[root@localhost ~]# echo ${!fruit[*]} //查看这个数组元素的索引
0 1 2
[root@localhost ~]# echo ${fruit[*]} //查看这个数组的元素
apple banana orange
[root@localhost ~]# echo ${fruit[@]} //查看这个数组的元素
apple banana orange
[root@localhost ~]# echo ${fruit[0]} //查看这个数组索引为0的元素
apple
[root@localhost ~]# declare -a | grep fruit //查看声明的所有变量可以看到数组
declare -a fruit='([0]="apple" [1]="banana" [2]="orange")'
(2)元素切片
[root@localhost ~]# arr=(1 2 3 4 5 6 7 8)
[root@localhost ~]# echo ${arr[*]:2:3} //提取从索引2开始的3个元素
3 4 5
[root@localhost ~]# echo ${arr[*]:2:2} //提取从2开始的2个元素
3 4
[root@localhost ~]# echo ${arr[*]:0:2}
1 2
(3)数组的遍历
#!/bin/bash
a=(1 2 3 4 5 6)
for i in ${a[@]}
do
echo $i
done
(4)定义某一个元素
[root@localhost ~]# fruit[0]=pear
[root@localhost ~]#
[root@localhost ~]# echo ${fruit[*]}
pear banana orange
(5)元素替换
定义或替换某一个元素
[root@localhost ~]# fruit[0]=pear
[root@localhost ~]#
[root@localhost ~]# echo ${fruit[*]}
pear banana orange
[root@localhost ~]# echo ${fruit[*]/banana/ba} //临时替换
pear ba orange
[root@localhost ~]# echo ${fruit[*]}
pear banana orange
(6)元素删除
[root@localhost ~]# unset fruit[0]
[root@localhost ~]#
[root@localhost ~]# declare -a | grep fruit
declare -a fruit=‘([1]=“banana” [2]=“orange”)’
(7)数组删除和指定下标的值删除
[root@localhost ~]# unset arr
(8)数组追加元素
方法一:直接使用下标进行元素的追加
数组名[下标]=变量
[root@localhost ~]# a=(10 20 30 40)
[root@localhost ~]# echo ${a[*]}
10 20 30 40
[root@localhost ~]# a[4]=50
[root@localhost ~]# echo ${a[*]}
10 20 30 40 50
[root@localhost ~]# a[5]=60
[root@localhost ~]# echo ${a[*]}
10 20 30 40 50 60
方法二:将数组的长度作为下标进行追加元素
数组名[${数组名[@]}]=变量名
方法三:使用+=进行追加
数组名+=(变量1 变量2 ...)
(9)查看所有数组—declare -a
2.获取数组下标对应的值
数组名=(元素0 元素1 元素2 ……) 定义数组
echo ${数组名[索引值]} 输出数组索引值对应的元素,索引值为从0开始
3.冒泡排序
每次对比,确定最后一位【所以我数组长度需要-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[*]}"