Могу ли я прочитать строку из 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
)

person Shawn J. Goff    schedule 25.02.2010    source источник
comment
array+=("four") и array+=("$line")   -  person Dennis Williamson    schedule 26.02.2010


Ответы (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 )

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

person Jonathan Leffler    schedule 25.02.2010

заменять

done < <( echo <<EOM

с участием

done < <(cat << EOM

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

person sha    schedule 25.02.2010

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

(echo <<EOM
test1
test2
test3
test4
EOM
) | while read line; do
        array=( ${array[@]} $line )
        echo ${array[@]}
done
person hlovdal    schedule 25.02.2010
comment
И, как говорит ша, кошка, вероятно, здесь более уместна, чем эхо. - person hlovdal; 26.02.2010