Shell数组

数组定义方法

方法一:

数组名=(value0 valuel value2 …)

  

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

  

方法二:

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

  

[root@localhost ~]# num=([0]=10 [1]=20 [3]=40 [4]=50 [2]=30 [6]=70)
[root@localhost ~]# echo ${num[*]}
10 20 30 40 50 70

  

方法三:

列表名="value0 valuel value2 …"
数组名=($列表名)

  

[root@localhost ~]# num1='60 50 40 30 20 10'
[root@localhost ~]# NUM1=($num1)
[root@localhost ~]# echo ${NUM1[*]}
60 50 40 30 20 10

  

方法四:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

  

[root@localhost ~]# num2[0]=10
[root@localhost ~]# num2[1]=100
[root@localhost ~]# num2[2]=1000
[root@localhost ~]# num2[3]=10000
[root@localhost ~]# echo ${num2[@]}
10 100 1000 10000

  

数组包括的数据类型

  • 数值类型
  • 字符类型:
    • 使用 " " 或 ‘ ’ 定义

 

获取数组长度

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

  

获取数值列表 

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

  

读取某下标赋值

[root@localhost ~]# echo ${arr_number[2]}
3
[root@localhost ~]# echo ${arr_number[0]}
1
[root@localhost ~]# echo ${arr_number[6]}

  

数组遍历

####没有引号时,使用 @ 和 * 的结果相同
[root@localhost ~]# for i in ${num[*]};do echo $i;done 10 20 30 40 50 70 [root@localhost ~]# for i in ${num[@]};do echo $i;done 10 20 30 40 50 70

  

####当使用双引号时,"*"会将参数作为整体输出,而"@"会将参数分开输出
[root@localhost ~]# for i in "${num[*]}";do echo $i;done 10 20 30 40 50 70 [root@localhost ~]# for i in "${num[@]}";do echo $i;done 10 20 30 40 50 70

  

数组切片

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

  

字符临时替换

[root@localhost ~]# num=([0]=10 [1]=20 [3]=40 [4]=50 [2]=30 [6]=70)
[root@localhost ~]# echo ${num[@]}
10 20 30 40 50 70
[root@localhost ~]# echo ${num[@]/70/60}  ####将数组中的70临时替换为60
10 20 30 40 50 60
[root@localhost ~]# echo ${num[@]}        ####重新加载后还原
10 20 30 40 50 70

  

字符永久替换

替换数组当中所有匹配到的字符

[root@localhost ~]# echo ${num[@]}
10 20 30 40 50 70
[root@localhost ~]# num=(${num[@]/70/60})
[root@localhost ~]# echo ${num[@]}
10 20 30 40 50 60
[root@localhost ~]# num=(${num[@]/0/9})
[root@localhost ~]# echo ${num[@]}
19 29 39 49 59 69
[root@localhost ~]# 

  

数组删除

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr        ####删除数组当中的所有元素
[root@localhost ~]# echo ${arr[@]}

  

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr[2]     ####删除数组当中某一位的元素
[root@localhost ~]# echo ${arr[@]}
1 2 4 5

  

数组追加元素

方法一:

array_name [index]=value

  

[root@localhost ~]# a=(0 1 2 3 4 5 6 7 8 9)
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9
[root@localhost ~]# a[10]=10
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10

  

方法二:

array_name [${#array_name[@]}]=value

  

[root@localhost ~]# a[${#a[@]}]=11
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10 11

  

方法三:

array_name=("${array_name[@]}" value1 … valueN)

  

[root@localhost ~]# a=("${a[@]}" 12 13 14 15)
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

  

双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个

不能将"@"替换为“*",如果替换为"*",不加双引号时与"@"的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

 

for i in "${array_name[@]}"; do echo $i; done

  

[root@localhost ~]# for i in "${a[@]}";do echo $i;done
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

  

方法四:

array_name+=(value1 … valueN)

 

[root@localhost ~]# a+=(16 17 18 19 20)
[root@localhost ~]# echo ${a[@]}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

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

 
 

向函数传数组参数

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

#!/bin/bash

test1() {
  echo "received array: $@"
  newarr=($*)
  echo "new array: ${newarr[@]}"

}

arr=(10 20 30 40 50)
echo "original array: ${arr[@]}"
test1 $arr

 

#!/bin/bash

test1() {
  echo "received array: $@"
  newarr=($*)
  echo "new array: ${newarr[@]}"

}

arr=(10 20 30 40 50)
echo "original array: ${arr[@]}"
test1 ${arr[@]}

 

 

从函数返回数组

#!/bin/bash

test1() {
  echo "received array: $*"
  newarr=($@)
  sum=0
  for i in ${newarr[@]}
  do
    sum=$[$sum + $i]
  done
  echo "sum of all parameters in array: $sum"
}

arr=(10 20 30 40 50)
echo "initial array: ${arr[@]}"
test1 ${arr[*]}

 

#!/bin/bash

test2() {
  newarr=(`echo $@`)
  length=${#newarr[@]}
  for ((i=0; i<$length; i++))
  do
    newarr[$i]=$[${newarr[$i]} * 2]
  done
  echo ${newarr[@]}
}

array=(10 20 30 40 50)
echo "initial array: ${array[@]}"
result=(`test2 ${array[@]}`)
echo "new array: ${result[@]}"

 

 

 

posted @ 2021-07-26 09:58  视觉装置在笑  阅读(32)  评论(0编辑  收藏  举报