乐趣区

Bash脚本编程之数组

声明数组

declare -a array_name

数组初始赋值

  • array_name[xx]=value
    其中 xx 表示下标,为大于等于 0 的整数数字
  • array_name=([xx]=value1 [yy]=value2 ...)
    其中 xx 表示下标,为大于等于 0 的整数数字
  • array_name=(value1 value2 value3 ...)declare -a array_name=(value1 value2 value3 ...)

数组追加元素

array=("${array[@]}" "new element" )array[${#array[*]}]="new element"

复制数组

array2=("${array1[@]}" )array2="${array1[@]}"

获取单个、全部或连续的部分数组元素

  • ${array_name[xx]}
    获取下标为 xx 的单个元素
  • ${array_name[@]}${array_name[*]}
    获取所有元素。在有引号括起的情况下,"${array_name[@]}"表示单独的数组元素,"${array_name[*]}"表示数组元素整体,没有引号括起的情况下都表示单独的数组元素,类似 $*$@的区别
  • ${array_name[@]:index:length}
    获取连续的部分数组元素,其中 :length 可省略。

    arrayZ=(one two three four five)
    
    # 提取所有元素
    echo ${arrayZ[@]:0}     # one two three four five
    # 提取下标从 1 开始 (包含) 的所有元素
    echo ${arrayZ[@]:1}     # two three four five
    # 提取下标从 1 开始 (包含) 的 2 个元素
    echo ${arrayZ[@]:1:2}   # two three

获取数组元素个数

${#array_name[*]}${#array_name[@]}

获取数组某个元素的字符串长度

${#array_name[xx]}

提取数组中某个元素的部分字符串

${array_name[xx]:index:length}, 其中:length 可省略

删除数组或数组元素

  • unset array_name[xx]
    删除下标为 xx 的数组元素,等同于array_name[xx]=
  • unset array_name
    删除整个数组

数组元素的字符串替换 / 删除操作

通常情况下,形如 ${name...} 表示法的字符串操作都可以应用在数组上,使用 ${name[@]...}${name[*]...}的方式。

  • 子字符串移除

    arrayZ=(one two three four five five)
    
    # 从每个元素的最左侧进行最短匹配,并删除匹配的字符串
    echo ${arrayZ[@]#fiv}   # one two three four e e
    echo ${arrayZ[@]#t*e}   # one two e four five five
    
    # 从每个元素的最左侧进行最长匹配,并删除匹配的字符串
    echo ${arrayZ[@]##t*e}  # one two four five five
    
    # 从每个元素的最右侧进行最短匹配,并删除匹配的字符串
    echo ${arrayZ[@]%h*e}   # one two t four five five
    
    # 从每个元素的最右侧进行最长匹配,并删除匹配的字符串
    echo ${arrayZ[@]%%t*e}  # one two four five five
  • 子字符串替换

    arrayZ=(one two three four fivefive fivefive)
    
    # 对每个元素进行字符串匹配,并替换第一次匹配的字符串
    echo ${arrayZ[@]/fiv/XYZ}   # one two three four XYZefive XYZefive
    
    # 对每个元素进行字符串匹配,并替换所有匹配的字符串
    echo ${arrayZ[@]//fiv/XYZ}  # one two three four XYZeXYZe XYZeXYZe
    
    # 对每个元素进行字符串匹配,并删除所有匹配的字符串
    echo ${arrayZ[@]//fi/}      # one two three four veve veve
    
    # 从每个元素的最左侧进行最长匹配,并替换匹配的字符串
    echo ${arrayZ[@]/#f*v/XYZ}  # one two three four XYZe XYZe
    
    # 从每个元素的最右侧进行最长匹配,并替换匹配的字符串
    echo ${arrayZ[@]/%i*e/XYZ}  # one two three four fXYZ fXYZ
    
    # 其他用法:函数的标准输出作为要替换的字符串
    replacement() {echo -n '!!!'}
    echo ${arrayZ[@]/%e/$(replacement)} # on!!! two thre!!! four fivefiv!!! fivefiv!!!
退出移动版