Shell数组添加元素及注意事项

 更新时间:2020年12月09日 14:48:02   作者:_荣耀之路_  
这篇文章主要介绍了Shell数组添加元素及注意事项,向Shell数组添加元素有多种方法,每种方法在使用时都有一些需要注意的地方,感兴趣的就一起来了解一下

向Shell数组添加元素有多种方法,每种方法在使用时都有一些需要注意的地方,没有见过这方面的总结资料,所以自己总结一下。

直接下标添加

array_name[index]=value

最简单的添加方式,直接用下标index为数组元素赋值,在使用时需要注意的是就是需要确保下标index处原本是没有值的,否则会替换index处原本的值。

数组长度添加

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

以数组长度为下标添加,每次只能增加一个元素。但此方法有一个前提,就是数组中的元素下标必须是连续的,否则会存在替换已有元素的风险。例如:

arr=([1]="a" [2]="b")
echo ${arr[@]}
arr[${#arr[@]}]="c"
echo ${arr[@]}

实际上并有添加元素,而是将下标为2的元素值“b”替换为了“c”。

重新创建数组

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

 这种方式不需要下标连续,可同时添加多个元素,但是有一些要注意的地方:

首先,使用此方式添加元素后,数组中原有元素的下标会重置,会从0开始变成连续的,如果不希望改变下标则不能使用这种方式。

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

最后,不能将“@”替换为“*”,虽然在输出数组元素时可以相互替换,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中。类似于特殊变量$@和$*的区别。

#!/bin/bash
arr1=()
initArray(){
  arr1=([2]="a b" [3]=2 [5]=4)
}
showArray(){
  echo "Elements in arr1: ${arr1[@]}"
  echo "Length of arr1: ${#arr1[@]}"
  echo "The 3rd elements is: ${arr1[2]}"
  echo
}
initArray
echo "original arr1:"
showArray
echo "add new elements 3 and 5"
echo "--------------------"
echo "use @ without quote"
arr1=(${arr1[@]} 3 5)
showArray
initArray
echo "use * without quote"
arr1=(${arr1[*]} 3 5)
showArray
initArray
echo "use @ with quote"
arr1=("${arr1[@]}" 3 5)
showArray
initArray
echo "use * with quote"
arr1=("${arr1[*]}" 3 5)
showArray

运行结果为:

original arr1:
Elements in arr1: a b 2 4
Length of arr1: 3
The 3rd elements is: a b
 
add new elements 3 and 5
--------------------
use @ without quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 6
The 3rd elements is: 2
 
use * without quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 6
The 3rd elements is: 2
 
use @ with quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 5
The 3rd elements is: 4
 
use * with quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 3
The 3rd elements is: 5

赋值运算符+=

array_name+=(value1 ... valueN)

 这种方式不需要元素下标连续,可以添加多个元素,添加后元素下标不会重置,不存在元素覆盖的风险。唯一要注意的就是“+=”前后不能有空格,并且后面的待添加元素必须用“()”包围起来,并且多个元素用空格分隔。新添加的元素的下标取决于原本数组中最后有值的元素的下标。

#!/bin/bash
arr1=()
initArray(){
  arr1=([2]="a b" [3]=2 [5]=4)
}
showArray(){
  echo "Elements in arr1: ${arr1[@]}"
  echo "Length of arr1: ${#arr1[@]}"
  echo "The 3rd elements is: ${arr1[2]}"
  echo
}
initArray
echo "original arr1:"
showArray
echo "add new elements 3 and 5"
echo "--------------------"
echo "use += "
arr1+=(3 5)
showArray
echo "The 8th elements is: ${arr1[7]}"

运行结果为:

original arr1:
Elements in arr1: a b 2 4
Length of arr1: 3
The 3rd elements is: a b
 
add new elements 3 and 5
--------------------
use +=
Elements in arr1: a b 2 4 3 5
Length of arr1: 5
The 3rd elements is: a b
 
The 8th elements is: 5

数组中原本的元素没有改变,新添加的元素下标是在最后有值的元素下标5的基础上递增的。

总结

添加方式 语法

可添加多个元素

下标必须连续 添加后下标改变 可能覆盖原有元素
直接下标添加 array_name[index]=value
数组长度添加

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

或array_name[${#array_name[*]}]=value

重新创建数组 array_name=("${array_name[@]}" value1 ... valueN)
赋值运算符+= array_name+=(value1 ... valueN)

到此这篇关于Shell数组添加元素及注意事项的文章就介绍到这了,更多相关Shell数组添加元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Linux中的awk命令

    详解Linux中的awk命令

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。这篇文章主要介绍了Linux中的awk命令的相关知识,需要的朋友可以参考下
    2019-11-11
  • shell中tail和head的用法小结

    shell中tail和head的用法小结

    本文主要介绍了shell中tail和head的用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Shell[[]]检测某个条件是否成立

    Shell[[]]检测某个条件是否成立

    本文主要介绍了Shell[[]]检测某个条件是否成立,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Shell脚本实现监测文件变化的示例详解

    Shell脚本实现监测文件变化的示例详解

    这篇文章主要和大家分享一个Shell脚本,可以实现监测文件变化功能。文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • Linux下使用tcpdump抓包的实现方法

    Linux下使用tcpdump抓包的实现方法

    tcpdump是Linux下面的一个开源的抓包工具,和Windows下面的wireshark抓包工具一样, 支持抓取指定网口、指定目的地址、指定源地址、指定端口、指定协议的数据。这篇文章主要介绍了Linux下使用tcpdump抓包的实现方法,需要的朋友可以参考下
    2015-10-10
  • Shell脚本中使用for循环和cat命令实现按顺序合并文件

    Shell脚本中使用for循环和cat命令实现按顺序合并文件

    这篇文章主要介绍了Shell脚本中使用for循环和cat命令实现按顺序合并文件,本文先是用sed命令来实现,发现不能完成需求,后使用for循环解决,需要的朋友可以参考下
    2015-01-01
  • 每天学一个 Linux 命令之more命令

    每天学一个 Linux 命令之more命令

    more命令,功能类似 cat ,more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能
    2016-12-12
  • Linux 中awk 提取包含某个关键字的段落

    Linux 中awk 提取包含某个关键字的段落

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具。这篇文章主要介绍了Linux 中awk 提取包含某个关键字的段落实例代码,需要的朋友可以参考下
    2020-01-01
  • gearman队列持久化引发的问题及解决方法

    gearman队列持久化引发的问题及解决方法

    这篇文章主要介绍了gearman队列持久化引发的问题及解决方法,需要的朋友可以参考下
    2014-07-07
  • 使用linux java shell启动脚本

    使用linux java shell启动脚本

    这篇文章主要为大家介绍了使用linux java shell启动脚本,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论