这是我正在尝试的。我想要的是最后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
)
答案 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