13

これが私が試していることです。私が欲しいのは、echoループするときに最後に「one two three four 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 シェルはwhile現在のシェルでループを実行しますが、Bash はそれをサブシェルで実行します — 少なくともデフォルトでは。Bourne シェルでは、ループは、ループ後にメイン シェルで使用できますが、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 に答える