代码之家  ›  专栏  ›  技术社区  ›  Joe

bash中的可变列表或数组结构?如何轻松附加到它?

  •  50
  • Joe  · 技术社区  · 15 年前

    我正在尝试在bash脚本中收集字符串值。我可以将字符串值附加到列表或数组结构中,以便在结尾处将它们回送出来,最简单的方法是什么?

    6 回复  |  直到 9 年前
        1
  •  88
  •   Dennis Williamson    15 年前
    $ arr=(1 2 3)
    $ arr+=(4)
    $ echo ${arr[@]}
    1 2 3 4
    

    因为bash使用稀疏数组,所以不应该使用元素计数 ${#arr} 作为索引。但是,您可以获得这样的索引数组:

    $ indices=(${!arr[@]})
    
        2
  •  11
  •   Ignacio Vazquez-Abrams    15 年前
    foo=(a b c)
    foo=("${foo[@]}" d)
    for i in "${foo[@]}"; do echo "$i" ; done
    
        3
  •  2
  •   ennuikiller    15 年前

    在bash中,用于附加到数组末尾的比较模糊的语法是:

    myarr[${#myarr[*]}]=”$newitem”
    
        4
  •  2
  •   codaddict    15 年前

    要补充伊格纳西奥在另一个答案中的建议:

    foo=(a b c)
    foo=("${foo[@]}" d) # push element 'd'
    
    foo[${#foo[*]}]="e" # push element 'e'
    
    for i in "${foo[@]}"; do echo "$i" ; done
    
        5
  •  2
  •   ghostdog74    15 年前
    $ for i in "string1" "string2" "string3"
    > do
    > array+=($i)
    > done
    $ echo ${array[@]}
    string1 string2 string3
    
        6
  •  0
  •   Community noseratio    7 年前

    虽然这个问题得到了回答,而且已经很老了,但是我想共享一个名称空间解决方案,因为它的工作速度比除 ennukiller 的答案(在我的100k行测试中,它比我的14秒赢得了约12秒,而列表附加解决方案需要几分钟)。

    您可以使用以下技巧:

    # WORKS FASTER THAN THESE LAME LISTS! ! !
    size=0;while IFS= read -r line; do
        echo $line
        ((++size))
        eval "SWAMP_$size='$line'"
    done
    

    或者您可以执行以下操作:

    #!/bin/bash
    size=0
    namespace="SWAMP"
    
    ArrayAppend() {
        namespace="$1"
        # suppose array size is global
        new_value="$2"
        eval "${namespace}_$size='$2'"
        eval "echo \$${namespace}_$size"
        ((++size))
    }
    
    ArrayAppend "$namespace" "$RANDOM"
    ArrayAppend "$namespace" "$RANDOM"
    ArrayAppend "$namespace" "$RANDOM"
    ArrayAppend "$namespace" "$RANDOM"
    ArrayAppend "$namespace" "$RANDOM"
    

    只要解释器在标签列表中,这里有一个链接 object oriented bash .