【问题标题】: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”。有什么想法吗?

【问题讨论】:

标签: arrays bash


【解决方案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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多