Могу ли я читать строку из heredoc в bash?

Вот что я пытаюсь. Я хочу, чтобы последний echo сказал "один два три четыре теста1...", когда он петли. Это не работает; 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
)

Ответ 1

Я бы обычно писал:

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 )

для добавления в массив.

Ответ 2

заменить

done < <( echo <<EOM

с

done < <(cat << EOM

Работал для меня.

Ответ 3

Вместо этого вы можете поставить команду перед:

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