URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6177
[ Назад ]

Исходное сообщение
"BASH: Как вывести значение переменной за пределы цикла?"

Отправлено Kroz , 17-Фев-07 00:38 
bash

Есть такая конструкция (глупая, просто для примера)

A="0"
echo "Cool" | while read B ; do
  A="1"
done
echo $A

В итоге получаем на выход 0, а хотелось бы получить 1. Как это сделать? Иными словами как сделать, чтобы значение присваивалось не локальной A а глобальной A?


Содержание

Сообщения в этом обсуждении
"BASH: Как вывести значение переменной за пределы цикла?"
Отправлено gyn61 , 17-Фев-07 09:59 
>bash
>
>Есть такая конструкция (глупая, просто для примера)
>
>A="0"
>echo "Cool" | while read B ; do
>  A="1"
>done
>echo $A
>
>В итоге получаем на выход 0, а хотелось бы получить 1. Как
>это сделать? Иными словами как сделать, чтобы значение присваивалось не локальной
>A а глобальной A?

В таком виде никак. Проблема не в цикле а в конвейере из-за которого порождается сабшелл. В таком виде работает:

A="0"
echo "Cool" > temp_file
while read B ; do
  A="1"
done < temp_file
echo $A


"BASH: Как вывести значение переменной за пределы цикла?"
Отправлено Kroz , 17-Фев-07 11:33 
>В таком виде никак. Проблема не в цикле а в конвейере из-за
>которого порождается сабшелл. В таком виде работает:
>
>A="0"
>echo "Cool" > temp_file
>while read B ; do
>  A="1"
>done < temp_file
>echo $A

Интересно. Спасибо.


"BASH: Как вывести значение переменной за пределы цикла?"
Отправлено ACCA , 21-Фев-07 07:42 
A="0"
while read B
do
  A="1"
done < <(echo "Cool")
echo $A

Обрати внимание, что между < < есть пробел, а между <( пробела нет. Шаг влево или вправо - попытка побега. Прыжок на месте - провокация.

Ключевые слова "subshell avoidance".


"BASH: Как вывести значение переменной за пределы цикла?"
Отправлено Kroz , 21-Фев-07 09:02 
>A="0"
>while read B
>do
>  A="1"
>done < <(echo "Cool")
>echo $A
>
>Обрати внимание, что между < < есть пробел, а между <( пробела
>нет. Шаг влево или вправо - попытка побега. Прыжок на месте
>- провокация.
>
>Ключевые слова "subshell avoidance".

М-да. Такой конструкции я не знал.
Thanks!