LINUX.ORG.RU

bash: инкремент к массиву в цикле

 


0

3

Имеем код:

unset list
while read line; do
    list+=("$line")
    echo "${#list[@]}"
done
echo "${#list[@]}"
Результат — количество строк, вынужденных быть введёнными в /dev/stdin.

Казалось бы (отличие от предыдущего кода на второй строке):

unset list
cat /dev/stdin | while read line; do
    list+=("$line")
    echo "${#list[@]}"
done
echo "${#list[@]}"

Авотнет, результат — ноль. Что характерно, echo "${#list[@]}" в цикле показывает предполагаемо-правильную длину.

Т. е. мы получаем массив с ожидаемым содержимым в первом случае, но не получаем его во втором. Почему так?

Вот так работает, я знаю:

unset list
while read line; do
    list+=("$line")
    echo "${#list[@]}"
done < <(cat /dev/stdin)
echo "${#list[@]}"

И всё же:

Почему так?

kalterfive ★★ ()
Ответ на: комментарий от kalterfive

И да, последний сегмент можно исполнять не в подоболочке: shopt -s lastpipe, но есть мнение, что это ухудшает понятность кода.

И пардон, но это точно должно быть в Bash FAQ’е (который под редакцией Вулиджа, а не Рамея) — советую почитать его, как будет время.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.