@Zezst
программист PHP

Почему bash не добаляет значение к массиву внутри цикла?

Есть безобидный код
imageList=()
ls -al | while read line
do
  echo "$line"
  imageList+=("alias")
  imageList+=($line)
done
echo ${#imageList[@]}

который в конце цикла возвращает пустой массив
при этом строка
echo "$line"
честно отрисовывает вывод на каждой итерации.

Можно предположить что я где то портачу с присвоением в массив, но
следуюший код
imageList=()
line="line"
imageList+=("alias")
imageList+=($line)
imageList+=("alias")
imageList+=($line)
imageList+=("alias")
imageList+=($line)
echo ${#imageList[@]}


отрабатывает так как и задумывал

может кто прояснить ситуацию

PS. ответ peakle помог. Скрипт работает. Но остались вопросы почему с for работает а с while нет
  • Вопрос задан
  • 122 просмотра
Решения вопроса 2
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
ls -al | while read line
В данной конструкции вы через пайп "|" вызываете подпроцесс, внутри которого крутится весь цикл while, и по завершению этого процесса переменные определенные внутри него, умирают вместе с ним.

Можно изменить перенаправление, чтобы обойтис без пайпа:

imageList=()
while read line
do
  echo "$line"
  imageList+=("alias")
  imageList+=($line)
done<<< $(ls -al)
echo ${#imageList[@]}
Ответ написан
@peakle
#!/bin/bash
imageList=()

for f in *; do
        imageList+=($f)
done

printf '%s\n' "${imageList[@]}"


see for details: mywiki.wooledge.org/ParsingLs

stack: https://superuser.com/a/418490
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@voleg4u
http://www.voleg.info/
В баше while совершенно не встроенная функция. Она вызывает fork, и поэтому все остальное выполняется в sub-shell. Заставить вразумительно работать while нереально.
Ответ написан
fzfx
@fzfx
18,5 дм
> почему с for работает а с while нет
если вкратце - while в вашем случае не имеет доступа к переменным вне тела цикла.
как только речь заходит о передаче вывода одной команды в другую, следует помнить о том, что эта другая запускается в отдельном процессе bash со всеми вытекающими вроде своего окружения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы