LINUX.ORG.RU

Непонятки с областью видимости переменных в bash


0

0

Доброго времени суток!

Есть проблемка с программированием на bash.
Непонятно область видимости переменных.
Скажем есть код
i=0
...
while ...
do
....
i=`expr $i + 1`
echo $i
done
echo $i
....

При работе цикла переменная i возрастает на 1. Скажем по каким-то причинам цикл завершается. И последнее "echo $i" показывает, что i равно 0. Собственно, какого черта? Вроде она должна быть равно кол-ву прошедших циклов.
Каким тогда образом передать некий результат полученный внутри цикла "наружу"?
Прошу помочь

anonymous

Re: Непонятки с областью видимости переменных в bash

все работает
$ cat test.sh
i=0
while true; do
    i=`expr $i + 1`
    echo $i
    [ $i = "3" ] && break
done
echo $i

$ sh test.sh
1
2
3
3

phoenix ★★★★ ()

Re: Непонятки с областью видимости переменных в bash

Вот пример

cat install
#!/bin/bash

STR_NUM=10000
i=0
cat /etc/X11/xorg.conf | awk '/^Section "InputDevice"/ {print NR}' | while read STR_NUM1
do
#echo $STR_NUM1

if [ $i -eq 0 ];
then
STR_NUM=$STR_NUM1
fi

i=`expr $i + 1`
echo $i
done
echo $i

exit 0

Вывод:
./install
1
2
3
4
5
6
0

Переменной i что-то присваивает 0.
Хотя ваш пример работает тоже.

anonymous ()

Re: Непонятки с областью видимости переменных в bash

это faq

переменные в шелле-ребенке не видны в шелле родителе. Пайп создает шелла-ребенка и его переменные не будут видны в родителе.

dilmah ★★★★★ ()

Re: Непонятки с областью видимости переменных в bash

> тогда как передать значения переменных в таком случае?

по разному можно.  Можно через временный файл.

А можно так:

STR_NUM=10000 
i=0 
cat /etc/X11/xorg.conf \
  | awk '/^Section "InputDevice"/ {print NR}' \
  | {
      while read STR_NUM1 
        do 
        #echo $STR_NUM1 

        if [ $i -eq 0 ]; 
        then 
          STR_NUM=$STR_NUM1 
        fi 

        i=`expr $i + 1` 
        echo $i 
      done 
      echo $i 
    }

exit 0

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