Вот то, что я пробую. То, что я хочу, является последним 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
)
Я бы обычно написал:
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 )
для добавления к массиву.
replace
done < <( echo <<EOM
with
done < <(cat << EOM
Сработало.
Вместо этого вы можете поставить команду перед while:
(echo <<EOM
test1
test2
test3
test4
EOM
) | while read line; do
array=( ${array[@]} $line )
echo ${array[@]}
done