Я могу считать строку из heredoc в ударе?

Вот то, что я пробую. То, что я хочу, является последним 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
)
11
задан Jim Counts 25 February 2010 в 21:22
поделиться

3 ответа

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

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 )

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

22
ответ дан 3 December 2019 в 03:35
поделиться

replace

done < <( echo <<EOM

with

done < <(cat << EOM

Сработало.

4
ответ дан 3 December 2019 в 03:35
поделиться

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

(echo <<EOM
test1
test2
test3
test4
EOM
) | while read line; do
        array=( ${array[@]} $line )
        echo ${array[@]}
done
1
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: