为啥循环时数组大小不增加? [复制]

Posted

技术标签:

【中文标题】为啥循环时数组大小不增加? [复制]【英文标题】:Why is array size not increased while looping? [duplicate]为什么循环时数组大小不增加? [复制] 【发布时间】:2018-05-10 04:00:32 【问题描述】:

我想知道为什么这段代码没有按预期工作:

a=(1)
echo "1 2 3 4" | while read f; do
    a+=("$f")
done
echo "$a[@]"

输出是“1”,而不是我想象的“1 1 2 3 4”。有什么想法吗?

【问题讨论】:

...和***.com/questions/6572411/… 你的while循环是多余的,只有一个值,即“1 2 3 4”。用echo $f替换数组concat来验证 【参考方案1】:

如果你创建了一个管道,你就创建了一个子外壳。 a 数组已正确修改,但仅在循环后打印 a 的内容之前退出的子 shell 中。

解决方案,使用进程替换或此处的字符串代替管道:

a=(1)
# this only loops once since there is only one line...
while read f; do    
    a+=("$f")
done < <(echo "1 2 3 4")    # < <(process substitution)
echo "$a[@]"
# 1 1 2 3 4

附带说明,如果您还想查看索引,请使用 declare -p a 而不是 echo "$a[@]" 在 Bash 中查看数组的内容。

这是您所看到的更好的示例:

#!/bin/bash
lines=("Top")
echo "Line 1
Line 2
Line 3" | while read -r line; do
    lines+=("$line")
    declare -p lines
done 
declare -p lines

打印:

declare -a lines=([0]="Top" [1]="Line 1")
declare -a lines=([0]="Top" [1]="Line 1" [2]="Line 2")
declare -a lines=([0]="Top" [1]="Line 1" [2]="Line 2" [3]="Line 3")
declare -a lines=([0]="Top")

请注意,lines 在管道之后仅恢复为一个条目。对比:

lines=("Top")
while read -r line; do
    lines+=("$line")
    declare -p lines
done < <(echo "Line 1
Line 2
Line 3")
declare -p lines

打印:

declare -a lines=([0]="Top" [1]="Line 1")
declare -a lines=([0]="Top" [1]="Line 1" [2]="Line 2")
declare -a lines=([0]="Top" [1]="Line 1" [2]="Line 2" [3]="Line 3")
declare -a lines=([0]="Top" [1]="Line 1" [2]="Line 2" [3]="Line 3")

【讨论】:

以上是关于为啥循环时数组大小不增加? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥通过jQuery中的for循环后数组顺序是随机的? [复制]

为啥不建议数组使用 JavaScript 的 For...In 循环? [复制]

当我们不知道数组的大小时,如何遍历整数数组? [复制]

为啥我的动态数组可以在不调整大小的情况下工作? [复制]

与 Promise.all() 中的解析相比,为啥在 while 循环中单独解析 Promise 数组时解析更慢? [复制]

在运行时增加数组的大小