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
Доброго времени суток.
Я позволю себе помимо решения задачи указать на пару ненужностей,
которые лишь загромождают код.
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.., второй сортируем их
по убыванию и третьей берем первый сверху.