LINUX.ORG.RU

bash глобальная переменная


0

0

Привет,

как сделать счетчик глобальным, что бы он не обнулялся в таком случае?

var1=0; echo -e "seq\nteq" | while read f; do var1=$(($var1+1)); echo process $var1 $f; done; echo done $var1

выхлоп у данного примера

process 1 seq
process 2 teq
done 0

а хочется

process 1 seq
process 2 teq
done 2

Можно писать куда нибудь в файл, но не хотелось бы

Спасибо

Можно попробовать так:

var1=0; while read f; do var1=$(($var1+1)); echo process $var1 $f; done < имя_файла; echo done $var1

Но тогда без файла не обойтись. В zsh можно так:

var1=0; while read f; do var1=$(($var1+1)); echo process $var1 $f; done <<(echo -e "seq\nteq"); echo done $var1 
Hetor
()
Ответ на: комментарий от Hetor

Он, кстати, не обнуляется, а не изменяется. Пайпы выполняются в subshell'е, а там var1 - уже другая переменная.

Hetor
()

Сделал так

var1=0; echo -e "seq\nteq" | if [ 1 = 1 ]; then while read f; do var1=$(($var1+1)); echo process $var1 $f; done; exit $var1; fi; echo done $?
the_moon
() автор топика
Ответ на: комментарий от the_moon

Cделай хотя бы так:

var1=0; echo -e "seq\nteq" | (while read f; do var1=$(($var1+1)); echo process $var1 $f; done; exit $var1); echo done $? 
Hetor
()
Ответ на: комментарий от undertaker

Странно, не работает, хотя по логике должно бы. Кстати, в zsh первый пример по умолчанию отрабатывает как надо.

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

А, ну да:

When first trying to read the value of full_name in a subshell, it is not there (echo shows a null string). The subshell quits, and full_name is exported in the parent - a variable can be exported after it has been assigned a value. Then a new subshell is started, in which the variable exported from the parent is visible. The variable is changed to hold another name, but the value for this variable in the parent stays the same.

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