13

这就是我正在尝试的。我想要的是最后echo说“一二三四 test1 ...”,因为它循环。它不工作;read line空空如也。这里有一些微妙的东西还是这不起作用?

array=( one two three )
echo ${array[@]}
#one two three
array=( ${array[@]} four )
echo ${array[@]}
#one two three four


while read line; do
        array=( ${array[@]} $line )
        echo ${array[@]}
done < <( echo <<EOM
test1
test2
test3
test4
EOM
)
4

3 回答 3

28

我通常会写:

while read line
do
    array=( ${array[@]} $line )
    echo ${array[@]}
done <<EOM
test1
test2
test3
test4
EOM

或者,更有可能:

cat <<EOF |
test1
test2
test3
test4
EOF

while read line
do
    array=( ${array[@]} $line )
    echo ${array[@]}
done

(请注意,带有管道的版本不一定适用于 Bash。Bourne shell 将while在当前 shell 中运行循环,但 Bash 在子 shell 中运行它——至少在默认情况下。在 Bourne shell 中,在在循环之后,循环将在主 shell 中可用;在 Bash 中,它们不可用。第一个版本总是设置数组变量,因此它可以在循环后使用。)

您还可以使用:

array+=( $line )

添加到数组中。

于 2010-02-25T21:18:43.763 回答
5

代替

done < <( echo <<EOM

done < <(cat << EOM

为我工作。

于 2010-02-25T21:19:21.840 回答
1

您可以将命令放在 while 前面:

(echo <<EOM
test1
test2
test3
test4
EOM
) | while read line; do
        array=( ${array[@]} $line )
        echo ${array[@]}
done
于 2010-02-25T21:20:03.400 回答