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

Исходное сообщение
"bash scripting теряется значение переменной"

Отправлено serg3263 , 20-Мрт-06 12:37 
ЕСТЬ:
Скрипт sh
-------------------------------------------
var=volue1
cat $fileToParse | while read ....
do
  ...
  var=volue2
  ...
done
echo ' var '$var
---------------------------------------------
Проблема: результат -- только volue1, все значения переменных, возм-но, и переменные,
используемые в конвейере cat ... | while теряются.

ВОПРОС:
Как передать\соxpанить значение переменной var после выполнения cat ... | while ?


Содержание

Сообщения в этом обсуждении
"bash scripting теряется значение переменной"
Отправлено newser , 20-Мрт-06 12:57 
>ЕСТЬ:
>Скрипт sh
>-------------------------------------------
>var=volue1
>cat $fileToParse | while read ....
>do
>  ...
>  var=volue2
>  ...
>done
>echo ' var '$var
>---------------------------------------------
>Проблема: результат -- только volue1, все значения переменных, возм-но, и переменные,
>используемые в конвейере cat ... | while теряются.
>
>ВОПРОС:
>Как передать\соxpанить значение переменной var после выполнения cat ... | while ?
>


Не совсем понятна, точнее совсем непонятна Ваша проблема. Судя по Вашему скрипту, если ДЕЙСТВИТЕЛЬНО происходит обработка cat ... | while, то значение var на выходе должно содержать volue2, если же нет, то вполне очевидно, что volue1.


"bash scripting теряется значение переменной"
Отправлено serg3263 , 20-Мрт-06 13:19 

>Не совсем понятна, точнее совсем непонятна Ваша проблема. Судя по Вашему скрипту,
>если ДЕЙСТВИТЕЛЬНО происходит обработка cat ... | while, то значение var
>на выходе должно содержать volue2, если же нет, то вполне очевидно,
>что volue1.

Значение volue2 "теряется", если определить другую переменную, напр var2 и писвоить ей значение в обработке cat .. | while, то по завершении cat её значение будет пустым.

cat ... | while read ...
do
  ...
  var2=volume21
  echo ' var2 is : '$var2
  ...
done
echo 'var2 after cat is : '$var2


Первый вывод выведет значение
var2 is : volume21

Второй вывод введет пустое
var2 is :

Переменная удалена после завершения cat ... | while ...
т. е. для выполнения cat sh выделила "отдельный" набор переменных, который затем был
удален.

Как "передать" значения из отдельной сессии sh или "назначить" имеющиеся переменные к использованию в отдельной сессии sh?


"bash scripting теряется значение переменной"
Отправлено madskull , 20-Мрт-06 13:23 

>Не совсем понятна, точнее совсем непонятна Ваша проблема. Судя по Вашему скрипту,
>если ДЕЙСТВИТЕЛЬНО происходит обработка cat ... | while, то значение var
>на выходе должно содержать volue2, если же нет, то вполне очевидно,
>что volue1.

Вы бы сперва проверили, а потом рассуждали теоритически.
Здесь Вам не тут, в баше другие законы :)


"bash scripting теряется значение переменной"
Отправлено newser , 20-Мрт-06 14:50 
>
>>Не совсем понятна, точнее совсем непонятна Ваша проблема. Судя по Вашему скрипту,
>>если ДЕЙСТВИТЕЛЬНО происходит обработка cat ... | while, то значение var
>>на выходе должно содержать volue2, если же нет, то вполне очевидно,
>>что volue1.
>
>Вы бы сперва проверили, а потом рассуждали теоритически.
>Здесь Вам не тут, в баше другие законы :)


Сорри, с башем не дружу. В "чистом" sh все работает. :)


"bash scripting теряется значение переменной"
Отправлено madskull , 20-Мрт-06 13:21 
Эта проблема (хоть это и не проблема вовсе) не раз уже обсуждалась.
Вдумайтесь, что происходит: cat через пайп запускает новый процесс с while. следовательно, все окружение процесса с while теряется при выходе из него.

Решение - использовать что-то вроде:
while ... done < <(cat ...)



"bash scripting теряется значение переменной"
Отправлено serg3263 , 20-Мрт-06 14:15 
>Эта проблема (хоть это и не проблема вовсе) не раз уже обсуждалась.
>
>Вдумайтесь, что происходит: cat через пайп запускает новый процесс с while. следовательно,
>все окружение процесса с while теряется при выходе из него.
>
>Решение - использовать что-то вроде:
>while ... done < <(cat ...)


Cпсб,

использовал:
----------------------------------
while read ...
do
  ...
  var=volume2
  ...
done < $fileToBeReadName
echo $var
----------------------------------

Результат: полученные в цикле while значения.