shell脚本之数组

263 阅读2分钟

数组的概念

  • 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)
  • 与大部分编程语言类似,数组元素的下标由 0 开始
  • Shell 数组用括号来表示,元素用"空格"符号分割开

数组的定义

方法一

数组名=(value1 value2 ... valuen)

方法二

数组名=([0]=value1 [1]=value2 [2]=value3 ...)

方法三

列表名=“value1 value2 valueN ..."
数组名=($列表名)

方法四

可以通过这种方式修改元素的值

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

Snipaste_2022-09-01_14-15-47.png

数组包括的数据类型

数值类型

字符类型

使用" " 或 ' ' 定义

读取数据列表

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

Snipaste_2022-09-01_14-19-06.png

获取数组长度

echo ${#value[*]}   
echo ${#value[@]}   

Snipaste_2022-09-01_14-20-13.png

查看数组内某一个元素的值

${数组名[n]}   ##n代表元素的下标echo ${array1[0]}  获取数组内第一个元素的值(下标为0的元素值)
echo ${array1[1]}  获取数组内第二个元素的值(下标为1的元素值)

Snipaste_2022-09-01_14-44-44.png

查看数组内最后一个元素的值

方法一

echo ${array1[-1]}  ##获取最后一个元素的值
echo ${array1[-2]}  ##获取倒数第二个元素的值

Snipaste_2022-09-01_14-48-05.png

方法二

length=${#array1[@]}  ##获取数组的长度
last=$[$length-1]     ##数组的长度减一
echo ${array1[$last]}  ##查看最后一个元素值
注意:
使用这种方式查看最后一个元素值,可以判断这个数组的下标是不是完整的。因为如果中间跳过了一个下标,那么此种方法无法获取最后一个元素的值。
​
echo ${array1[${#array1[@]}]} ##查看下标值为数组长度的元素,如果没有跳过某个下标值,那么数组长度的元素为空,如果不为空说明跳过某个下标值,数组下标不完整

Snipaste_2022-09-01_14-58-28.png

数组遍历(使用for循环)

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

输出结果:

Snipaste_2022-09-01_15-05-02.png

数组常用操作

数组分片(截取)

${数组名[@]:起始位置:截取长度}        //起始位置从0算起
​
 ${数组名[@]}           //获取整个数组的元素值
 ${数组名[@]:0:3}      //从下标为0的元素开始截取,共截取3个元素。(即截取元素1到元素3)
 ${数组名[@]:2:2}      //从下标为2的元素开始截取,共截取2个元素。(即截取元素3到元素4)

Snipaste_2022-09-01_15-18-29.png

数组元素替换

1.临时替换

echo ${数组名[@]/旧字符/新字符}    //会替换所有元素中能匹配到的字符,但这是临时替换,不会改变原有数组的值

Snipaste_2022-09-01_15-21-45.png

2.永久替换

数组名=(${数组名[@]/旧字符/新字符})

Snipaste_2022-09-01_15-59-28.png

数组删除

1.删除数组中某个元素

unset 数组名[n]        //删除数组内的某一个元素,n为下标值

Snipaste_2022-09-01_16-00-54.png

2.删除整个数组

unset 数组名[*]
 或
 unset 数组名[@] 

Snipaste_2022-09-01_16-04-07.png

数组追加元素

方法一:直接使用下标进行元素的追加

数组名[n]=元素值   

Snipaste_2022-09-01_16-12-47.png

方法二:将数组的长度作为下标进行追加元素

数组名[数组长度]=元素值

注意:

如果最初定义数组的时候漏掉下标的值,即统计数组的长度就是错误值,那么在追加元素的时候会出错,可能不是追加而是替换某个元素

Snipaste_2022-09-01_16-18-28.png

方法三:重新赋值

数组名=("${数组名[@]}" 元素1 元素2 .....)

双引号不能省略,否则,当数组array name中存在包含空格的元素时会按空格将元素拆分成多个 不能将“@”替换为 “ * ”如果替换为“ * ”,不加双引号时与"@"的表现一致,加双引号时,会将数组array name中的所有元素作为一个元素添加到数组中

Snipaste_2022-09-01_16-24-54.png

方法四

数组名+=(元素1 元素2 .....)
待添加元素必须用“()"包围起来,并且多个元素用空格分隔

Snipaste_2022-09-01_16-14-53.png

向函数传数组参数

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

操作步骤:

第一步:向函数传入数组的时候需要先把数组转换成列表作为函数的参数使用
函数名 ${数组名1[@]}
​
第二步:在函数内把传入的列表重新组合成数组
数组名2=($@)
​
第三步:在函数外重新组合成数组:
数组名3=(`函数名 ${数组名1[@]}`)

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

#!/bin/bashtext() {
    echo "函数接受到的参数列表:$@"  ##不能写$1,否则只会输出数组的第一个元素
    warr=($@)   ##在函数内把传入的列表重新组合成数组
    echo "新数组的值为:${warr[@]}" 
}
​
######main##############
add=(1 2 3 4 5)
echo "原数组的值:${add[@]}"
test ${add[@]}  ##调用函数时,将数组拆分成列表传参到函数中

Snipaste_2022-09-01_17-17-33.png

实际操作一.使用函数输出数组所有元素的累加值

#!/bin/bashtext() {
   echo "函数接受到的参数列表:$@"
   warr=($@)
   sum=0
   for i in ${warr[@]}
   do
     sum=$[$sum+$i]
   done
   echo "新数组的值为:$sum"
​
}
​
add=(10 20 30 40)
echo "原数组的值:${add[@]}"
text ${add[@]}

Snipaste_2022-09-01_17-22-10.png

实例操作二:通过函数将数组中的所有元素值*2,并再以新数组形式输出

#!/bin/bash
text() {
  bb=($@)
  n=0
  for i in ${bb[@]}
  do
    a=$[$i * 2]
    bb1[$n]=$a
    let n++
  done
  echo ${bb1[@]}
}
​
array=(10 20 30 40 50)
echo "原数组的值:${array[@]}"
result=$(text ${array[@]})
echo "新的数组的值列表为:$result"

Snipaste_2022-09-01_18-30-46.png

方法二:

#!/bin/bash
text() {
  bb=($@)
  for ((i=0;i<${#bb[@]};i++))
  do
     bb1[$i]=$[${bb[$i]} * 2]
  done
  echo ${bb1[@]}
​
}
​
array=(10 20 30 40 50)
echo "原数组的值:${array[@]}"
​
result=$(text ${array[@]})
echo "新的数组的值列表为:$result"

Snipaste_2022-09-01_18-45-36.png