我正在尝试在bash脚本中收集字符串值。我可以将字符串值附加到列表或数组结构中,以便最后回显它们的最简单方法是什么?
Answers:
foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done
在bash中追加到数组末尾的语法相当晦涩:
myarr[${#myarr[*]}]=”$newitem”
尽管这个问题已经回答并且很老了,但我还是想分享一个命名空间解决方案,因为它的工作速度比任何其他方式都要快,除了ennukiller的回答(在我的10万行测试中,它相对于〜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的链接。
eval
用于分配(尤其是在用户输入时)!您的代码会受到代码注入的影响,并且非常不安全(因此被破坏)!所以……甚至比la脚的名单还残酷:)
。
mapfile
:mapfile -t lines < file
。
eval
安全使用方式……
mapfile
是Bash内置函数(您有一个标记为bash的问题)。