Bash中的可变列表或数组结构?我怎样才能轻易附加到它?

时间:2010-01-06 13:59:47

标签: arrays bash scripting

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

6 个答案:

答案 0 :(得分:92)

$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4

由于Bash使用稀疏数组,因此不应使用元素计数${#arr}作为索引。但是,您可以获得一系列索引:

$ indices=(${!arr[@]})

答案 1 :(得分:11)

foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done

答案 2 :(得分:3)

添加Ignacio在另一个答案中建议的内容:

foo=(a b c)
foo=("${foo[@]}" d) # push element 'd'

foo[${#foo[*]}]="e" # push element 'e'

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

答案 3 :(得分:2)

在bash中附加到数组末尾的相当模糊的语法是:

myarr[${#myarr[*]}]=”$newitem”

答案 4 :(得分:2)

$ for i in "string1" "string2" "string3"
> do
> array+=($i)
> done
$ echo ${array[@]}
string1 string2 string3

答案 5 :(得分:0)

虽然这个问题已经回答并且已经很老了,但我想分享命名空间解决方案,因为除了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的链接。