Можно ли прочитать строку из heredoc в bash? - PullRequest
11 голосов
/ 26 февраля 2010

Вот что я пытаюсь. Я хочу, чтобы последний 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
)

Ответы [ 3 ]

21 голосов
/ 26 февраля 2010

Я бы нормально написал:

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 shell, назначения, сделанные в цикле, будут доступны в основной оболочке после цикла, в Bash их нет. Первая версия всегда устанавливает переменную массива, поэтому она доступна для использования после цикла.)

Вы также можете использовать:

array+=( $line )

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

4 голосов
/ 26 февраля 2010

заменить

done < <( echo <<EOM

на

done < <(cat << EOM

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

1 голос
/ 26 февраля 2010

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

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