Arrays Bash中的可变列表或数组结构?我怎样才能轻松地附加到它?
我试图在bash脚本中收集字符串值。将字符串值附加到列表或数组结构中,以便在末尾回显它们的最简单方法是什么?在bash中,将字符串值附加到数组末尾的语法相当模糊:Arrays Bash中的可变列表或数组结构?我怎样才能轻松地附加到它?,arrays,bash,scripting,Arrays,Bash,Scripting,我试图在bash脚本中收集字符串值。将字符串值附加到列表或数组结构中,以便在末尾回显它们的最简单方法是什么?在bash中,将字符串值附加到数组末尾的语法相当模糊: foo=(a b c) foo=("${foo[@]}" d) for i in "${foo[@]}"; do echo "$i" ; done myarr[${#myarr[*]}]=”$newitem” 为了补充Ignacio在另一个答案中的建议: foo=(a b c) foo=("${foo[@]}" d) # push
foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done
myarr[${#myarr[*]}]=”$newitem”
为了补充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
因为Bash使用稀疏数组,所以不应该使用元素计数${arr}
作为索引。但是,您可以获得如下索引数组:
$ indices=(${!arr[@]})
虽然这个问题已经得到了回答,而且已经很老了,但我还是想分享一个名称空间解决方案,因为它的工作速度比除的答案以外的任何其他方法都快得多(在我的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"
只要译员在标记列表中,这里就有一个链接。正如丹尼斯·威廉姆森的回答所指出的,这在某些情况下是不正确的;bash数组是稀疏的,索引${myarr[*]}可能不是最后一个索引。不要将
eval
用于赋值(尤其是在用户输入时)!您的代码受到代码注入的影响,并且非常不安全(因此被破坏)!所以…它甚至比lame list:)
更糟糕。顺便说一下,如果您的唯一目标是在数组中逐行读取文件,请使用Bash≥4您应该使用mapfile
:mapfile-t行
。不过,如果您要求,我可以向您展示一种鲜为人知的安全使用eval
的方法…@gniourf\gniourf,当然。我想看看。mapfile
是一个Bash内置文件(您遇到了一个问题)。
# 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"