The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"теряется значение переменной"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"теряется значение переменной"  +/
Сообщение от любитель on 15-Авг-09, 22:41 
Прошу помощи у знатоков шела.
При чтении со стандартного ввода все хорошо
скрипт

  #!/bin/bash
  a=0
  while read b; do
    [ $a -lt $b ] && a=$b
  done
  echo max: $a

запускаем
i@/home/i $ ./script
3
7
2
max: 7

Но при трении с конвеера:
file:
3
7
2

скрипт

  #!/bin/bash
  a=0
  cat file | while read b; do
    [ $a -lt $b ] && a=$b
    echo $a
  done
  echo max: $a

запускаем
i@/home/i $ ./script
3
7
7
max: 0

Почему потерялось значение переменной "a" при выходе из цикла? Это глюк, или особенность,
которую я не понимаю?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "теряется значение переменной"  +/
Сообщение от gaa (ok) on 15-Авг-09, 23:14 
>Почему потерялось значение переменной "a" при выходе из цикла? Это глюк, или
>особенность, которую я не понимаю?

Это особенность, которую ты не понимаешь. При подобном вызове (через
пайп) для while создаётся отдельный процесс и изменение переменных
происходит внутри него.

Для того, чтобы прокинуть значение переменной "наружу", сохрани её во
временный файл, а потом прочитай оттуда.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "теряется значение переменной"  +/
Сообщение от любитель on 15-Авг-09, 23:23 
>>Почему потерялось значение переменной "a" при выходе из цикла? Это глюк, или
>>особенность, которую я не понимаю?
>
>Это особенность, которую ты не понимаешь. При подобном вызове (через
>пайп) для while создаётся отдельный процесс и изменение переменных
>происходит внутри него.
>
>Для того, чтобы прокинуть значение переменной "наружу", сохрани её во
>временный файл, а потом прочитай оттуда.

Спасибо, воспользуюсь подсказкой.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "теряется значение переменной"  +/
Сообщение от const86 (ok) on 16-Авг-09, 03:57 
>Для того, чтобы прокинуть значение переменной "наружу", сохрани её во временный файл, а потом прочитай оттуда.

Бр-р-р... Можно вернуть через другой пайп: завернуть цикл в функцию, в которой сделать echo, и поймать снаружи через $(). Или поступить ещё хитрее: завернуть в функцию и заставить эту функцию сделать всю оставшуюся работу, но это может быть по-своему неудобно, смотря что за задача.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "теряется значение переменной"  +/
Сообщение от const86 (ok) on 16-Авг-09, 03:59 
>  cat file | while read b; do

Чтобы избежать работы в subshell: while read b; do ...; done < file

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "теряется значение переменной"  +/
Сообщение от любитель on 16-Авг-09, 21:19 
Всем спасибо за помощь.
Остановился на варианте передачи значения через стандартный вывод,
который мне показался наиболее простым

getuid()
{
  ldapsearch -LLL -s one -b "ou=People,$SUFFIX" uidNumber | grep uidNumber | {
    maxuid=0
    while read s uid; do
      [ $uid -gt $maxuid ] && maxuid=$uid
    done
    echo $((maxuid + 1))
  }
}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру