shell数组

308 阅读2分钟

1. 数组

1.1 什么是数组

数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。

组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。

用于区分数组的各个元素的数字编号称为下标。元素的下标从0开始。

数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。

1.2 数组的定义方法

  • 法一

数组名=(value0 valuel value2 ...)

image.png

  • 法二

数组名=([0]=value [1]=va1uc [2]=value ...)

image.png

  • 法三

列表名="value0 valuel value2 ..."

数组名=($列表名)

image.png

  • 法四

数组名[0]="value"

数组名[1]="value"

数组名[2]="value"

image.png

2. 数组包括的数据类型

  1. 数值类型

image.png

2. 字符类型:使用" "或' '定义

image.png

3. 获取数组长度

[root@localhost ~]# arr_number=(1 2 3 4 5)
[root@localhost ~]# arr_length=$[#arr_number[*]]
           ${#arr_number[@]}
[root@localhost ~]# echo $arr_length

image.png

4. 获取数据列表

echo ${arr_number[*]}
echo ${arr_number[@]}

image.png

5. 读取某下标赋值

  • 格式

arr_index2=${arr_number[2]}

echo $arr_index2

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr_index2=${arr[2]}
[root@localhost ~]# echo $arr_index2

image.png

6. 数组遍历

#!/bin/bash
arr_number=(1 2 3 4 5)
for v in $(arr_number[@]}
do
echo $v
done

image.png

7. 数组切片

格式:${数组名[@或*]:起始位置(就是下标):长度]

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]:2:3}
[root@localhost ~]# echo ${arr[@]:0:2}

image.png

8. 数组替换

  • 格式

${数组名[@或*]/查找字符/替换字符)

  • 法一

并不会替换数组原有内容

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]/4/6)}
[root@localhost ~]# echo ${arr[@]}

image.png

  • 法二

实现改变原有数组,可通过重新赋值实现

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr=(${arr[@]/4/6})
[root@localhost ~]# echo ${arr[@]}

image.png

9. 数组删除

  • 格式

unset 数组名或数组名[*]

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr     //删除数组
或
[root@localhost ~]# unset arr[*]
[root@localhost ~]# echo ${arr[@]}

image.png

  • 删除数组元素
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr[2]   //删除第三个元索
[root@localhost ~]# echo ${arr[*]}

image.png

10. 数组追加元素

10.1 法一

格式:array_name[index1]=value

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr[5]=6
[root@localhost ~]# echo ${arr[*]}

image.png

10.2 法二

使用${#}算出它数组的个数,当作下标数进行添加。但是不适用于数组中间缺少某个数组数的

格式:array_name[${#array_name[@]}]=value

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr[${#arr[@]}]=6 
[root@localhost ~]# echo ${arr[@]}

image.png

  • 不适用这个方法的数组例子
[root@localhost ~]# arr[0]=1
[root@localhost ~]# arr[1]=2
[root@localhost ~]# arr[3]=4
[root@localhost ~]# arr[4]=5
[root@localhost ~]# echo ${arr[@]}
1 2 4 5
[root@localhost ~]# arr[${#arr[@]}]=6
[root@localhost ~]# echo ${arr[@]}
1 2 4 6

image.png

10.3 法三

重新定义了一次数组

格式:array_name=("${array_name[@]}" valne1...valueN)

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr=("${arr[@]}" 6 7)
[root@localhost ~]# echo ${arr[@]}

image.png

  1. 双引号不能省略,否则当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
  2. 不能将@替换为*,如果替换为*,不加双引号时与@的表现一致,加双引号时,会将数组array_name中的所有元索作为一个元索添加到数组中
  • 例如
[root@localhost ~]# arr=([0]="zhang san" [1]="li si")
[root@localhost ~]# echo ${arr[*]}
zhang san li si
[root@localhost ~]# echo ${#arr[*]}
2
[root@localhost ~]# arr1=(${arr[@]} "wang wu" "lao liu")   //不加引号的话,他会把arr数组里的东西拆分单个的进行输出
[root@localhost ~]# echo ${arr1[*]}
zhang san li si wang wu lao liu
[root@localhost ~]# echo ${#arr1[*]}
6
[root@localhost ~]# arr2=("${arr[@]}" "wang wu" "lao liu")   //加上引号,它会把数组正常输出
[root@localhost ~]# echo ${arr2[*]}
zhang san li si wang wu lao liu
[root@localhost ~]# echo ${#arr2[*]}
4
[root@localhost ~]# arr3=("${arr[*]}" "wang wu" "lao liu")   //@替换成*,他会把整个数组当作一个整体输出
[root@localhost ~]# echo ${arr3[*]}
zhang san li si wang wu lao liu
[root@localhost ~]# echo ${#arr3[*]}
3

10.4 法四

  • 格式

array_name+=(value1 ... valueN)

待添加元素必须用()包围起来,并且多个元素用空格分隔

[root@localhost ~]# arr=(10 20 30 40 50)
[root@localhost ~]# arr+=(60 70)
[root@localhost ~]# echo ${arr[*]}

image.png

11. 向函数传数组参数

11.1获取数组的数据列表作为函数的参数使用

如果将数组变量作为函数参数,函数只会取数组变量的第一个值。

  • 举例

test1() {

echo "array: $@"

newarrary=($1) //在函数内把传入的列表重新组合成数组,写$1,否则只会输出数组的第一个元素

echo "新数组的值为: ${newarrary[*]}"

}

array=(3 2 1 4 5)

echo "原始数组的值为: ${array[*]}"

test1 $array

解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。

  • 举例

test1() {

newarrary=($(echo $@))

echo "新数组的值为: ${newarrary[*]}"

}

array=(3 2 1 4 5)

echo "原始数组的值为: S{array[*]}"

test2 ${array[*]}

image.png

11.2 使用for循环,令新数组内的每个元素值乘2

  • i<=数组长度减1
 #!/bin/bash
 fun02 () {
 #在函数内把传入的列表重新组合成数组
    newarr=($@)
    echo "新数组的值为:${newarr[@]}"
 # ${#newarr[@]} 为数组的长度
    for ((i=0;i<=${#newarr[@]}-1;i++))
    do
       newarr[$i]=$[${newarr[$i]}*2]
    done
    echo "每个元素值翻倍后为:${newarr[@]}"
 }
 #### main ####
 arr=(1 2 3 4 5)
 echo "原数组的值为:${arr[@]}"
 #把数组转换成列表作为函数的参数使用
 fun02 ${arr[@]}