Отправляет email-рассылки с помощью сервиса Sendsay

bash-про переменную

Есть такой кусок скрипта для определения максимального UID из passwd в
некотором диапазоне номеров
UIDMAX=1
cat passwd | grep ^.*:x:10..: | while read LINE
do
LINE=`echo $LINE | awk --field-separator : '{print $3}'`
if [ $LINE -gt $UIDMAX ];
then UIDMAX=$LINE
fi
done
echo $UIDMAX
Внутри цикла UIDMAX изменяется и все работает правильно, но при выходе
из цикла снова принимает первоначальное значение 1.
Предполагаю, что внутри цикла где-то запускается дочерний процесс и
значение переменной не возвращается в родительский. Но как все это побороть?

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9108; Возраст листа: 343; Участников: 1190
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/183246



-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать : mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sat, 03 Jul 2004 09:33:22 +0400 (#183246)

 

Ответы:

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

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

03.07.2004 9:33, avm7 пишет:

Вместо 'cat passwd | grep ...' можно написать просто 'grep ... passwd', ага?

Дружище, awk здесь - это явный перебор, достаточно cut :) Ну да ладно,
дело не в этом.

Правильно предполагаешь. На каждого участника конвейера запускается по
дочернему процессу, в частности, цикл while выполняется в дочернем шелле.

Можно пытаться справиться с этим всевозможными способами, но я приведу
совсем другой вариант:
awk '/^.*:x:10..:/' -f: '{ print $3; }' | sort -nr | head -1

Всё. Первой командой мы выводим все uid'ы вида 10.., второй сортируем их
по убыванию и третьей берем первый сверху.

Ответить   Sat, 03 Jul 2004 10:17:52 +0400 (#183258)

 

03.07.2004 10:17, Alexey Rusakov пишет:

Ой, прошу прощения, на самом деле вот так:
awk -F: '/^.*:x:10..:/ { print $3; }' /etc/passwd | sort -nr | head -1

Или можно не использовать awk, тогда:
cut -d ':' -f 3 /etc/passwd | grep "^10.." | sort -nr | head -1

Такой вариант понятнее, но на один пайп больше.

Ответить   Sat, 03 Jul 2004 10:39:24 +0400 (#183268)