为啥循环时数组大小不增加? [复制]
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 数组时解析更慢? [复制]