LINUX.ORG.RU

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


1

0

bash

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

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

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

В общем случае никак, тут дело не в локальных переменных. Каждая
команда из твоего пепилайна пускается в своем собственном подшеле,
из него нельзя менять значения переменных родительского шела.

Более подробно можешь почитать, например, тут:

http://www.faqs.org/docs/bashman/bashref_48.html#SEC48

aton
()

Более-менее очевидный метод, если не надо ничего из цикла выводить:

#! /bin/bash

export A="0"
A=`
echo $'Cool\ncool' | (while read B ; do
  A=$[$A+1]
  echo qqqqq
done >/dev/null; echo $A )`
echo $A

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

Используй временный файл для данных, а не для переменных.

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

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

Дык и это никто не отменял!

$ super_puper() { echo cool | { while read B; do echo 1;
exit; done 2>/dev/null; echo 0; }; }

$ A=`super_puper`
$ echo $A
1
$ A=`expr $(echo cool | wc -l) != 0`

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

>Дык и это никто не отменял!

не только никто не отменял, но еще и выше об этом написано

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

Особенно вариант с функцией понравился.

Прикольно. Спасибо за ответы, буду что-то думать.

". . . постепенно, шаг за шагом раскрывая мудрость и красоту Unix" (C) Advanced Bash-Scripting guide

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