LINUX.ORG.RU

Как работает read -a и readarray?

 , ,


1

2

Нужно прочитать выхлоп и занести его в массив. Разделитель - новая строка. Пример

dig +noall +short yandex.ru
77.88.55.55
77.88.55.50
5.255.255.80
5.255.255.88

dig +noall +short yandex.ru | readarray arr1
echo ${arr1[@]}
пустота

Тоже самое с read -a, тоже самое с readarray -d '\n', тоже самое с

dig +noall +short yandex.ru | while read -r i; do arr1+=( $i ); done

Судя по всему, дело не в сепараторе элементов (IFS=$‘\n’ не помогает). Как занести все в массив?

Нужен именно вариант со строками, без замен на пробел или еще чего.

Entmatix ()
Последнее исправление: Entmatix (всего исправлений: 1)

Это один из подводных камней шелла: при использовании идиомы | while создаётся дочерний процесс, внутри которого переменные изменяются, а после завершения которого благополучно теряются. (Точнее, при использовании | всегда создаётся дочерний процесс, но когда с правой стороны находится тоже bash, родительский процесс не может обратно получить его переменные.) Раз уж используете башизмы, может, поможет readarray ... <(команда)?

AITap ★★★★★ ()
Ответ на: комментарий от AITap
readarray arr2 < (dig +noall +short yandex.ru)
-bash: syntax error near unexpected token `('

Но работает так.

readarray arr2 <<< $(dig +noall +short yandex.ru)
echo ${arr2[@]}
77.88.55.66 5.255.255.55 77.88.55.70 5.255.255.50
Entmatix ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.