Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Bash中的可变列表或数组结构?我怎样才能轻松地附加到它?_Arrays_Bash_Scripting - Fatal编程技术网

Arrays 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

我试图在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 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"