LINUX.ORG.RU
решено ФорумAdmin

Locale Variables in «While» and «For» loop

 


0

2

Здравствуй любимый форум, есть вопрос из чистого любопытства. Опять наступил на старые грабли и задался вопросом - по какому кармическому закону после цикла while все локальные переменные обнуляются, а после for нет? Смысл же какой-то скрытый есть в этом? И как избежать этого обнуления в while, если мне важен получившийся на выходе массив? Для моей конкретной задачи я просто заменил на for, но вдруг в будущем нужен будет именно while?

Ничего нигде не обнуляется. Просто в некоторых случаях шелл форкается, а в некоторых - нет. Изменение переменных среды в дочерних процессах никак не может повлиять на родительские процессы.

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

Я неправильно выразился. Не обнуляется, но возвращается к значениям до цикла. While ведь исполняется в другом инстансе шела?

napalmed
() автор топика
Ответ на: комментарий от napalmed

Не обнуляется, но возвращается к значениям до цикла.

И не возвращается, значения вообще не изменяются.

While ведь исполняется в другом инстансе шела?

В другом процессе.

Deleted
()
Ответ на: комментарий от napalmed

ИМХО разницы нет и правила для них должны быть одинаковые. Детали нужно смотреть в манах и исходниках.

Deleted
()

В баше нет scope'ов как таковых. Разве что local в пределе функции.

KennyMinigun ★★★★★
()
Ответ на: комментарий от napalmed
unset z; x=1;
while [[ $x -lt 10 ]]; do echo $((x=x+1)); z=$x; done;
echo $x $z

Честно считает от 2 до 10, и z(заведённый в while) и x после выполнения становятся 10.

В чём была проблема?

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

чем хернёй страдать показал-бы код. AFAIK никакой разницы между for и while нет, и быть не может. Очевидно ты запускаешь субпроцесс для while.

while ... do .. ; done < variables

ещё можно

while …
do …
done < <(command)
emulek
()
Ответ на: комментарий от selivan
$ unset x; unset z; while (( x < 10 )); do (( z = ++x )); done; echo z=$z
z=10
$ unset x; unset z; for (( ; x < 10; z = ++x )); do true; done; echo z=$z
z=10

В чём была проблема?

в коде.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.