Прошу помощи у знатоков шела.
При чтении со стандартного ввода все хорошо
скрипт#!/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" при выходе из цикла? Это глюк, или особенность,
которую я не понимаю?
>Почему потерялось значение переменной "a" при выходе из цикла? Это глюк, или
>особенность, которую я не понимаю?Это особенность, которую ты не понимаешь. При подобном вызове (через
пайп) для while создаётся отдельный процесс и изменение переменных
происходит внутри него.Для того, чтобы прокинуть значение переменной "наружу", сохрани её во
временный файл, а потом прочитай оттуда.
>>Почему потерялось значение переменной "a" при выходе из цикла? Это глюк, или
>>особенность, которую я не понимаю?
>
>Это особенность, которую ты не понимаешь. При подобном вызове (через
>пайп) для while создаётся отдельный процесс и изменение переменных
>происходит внутри него.
>
>Для того, чтобы прокинуть значение переменной "наружу", сохрани её во
>временный файл, а потом прочитай оттуда.Спасибо, воспользуюсь подсказкой.
>Для того, чтобы прокинуть значение переменной "наружу", сохрани её во временный файл, а потом прочитай оттуда.Бр-р-р... Можно вернуть через другой пайп: завернуть цикл в функцию, в которой сделать echo, и поймать снаружи через $(). Или поступить ещё хитрее: завернуть в функцию и заставить эту функцию сделать всю оставшуюся работу, но это может быть по-своему неудобно, смотря что за задача.
> cat file | while read b; doЧтобы избежать работы в subshell: while read b; do ...; done < file
Всем спасибо за помощь.
Остановился на варианте передачи значения через стандартный вывод,
который мне показался наиболее простым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))
}
}