我可以在bash中读取heredoc的行吗?

时间:2010-02-25 21:05:14

标签: bash heredoc

这是我正在尝试的。我想要的是最后echo说“一二三四测试......”,因为它循环。它不起作用; 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
)

3 个答案:

答案 0 :(得分:21)

我通常会写:

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会在当前shell中运行while循环,但Bash会在子shell中运行它 - 至少在默认情况下是这样。在Bourne shell中,循环中的赋值在循环之后在主shell中可用;在Bash中,它们不是。第一个版本总是设置数组变量,因此它可以在循环之后使用。)

你也可以使用:

array+=( $line )

添加到数组中。

答案 1 :(得分:4)

替换

done < <( echo <<EOM

done < <(cat << EOM

为我工作。

答案 2 :(得分:1)

您可以将命令放在前面而不是:

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