Как мы можем написать скрипт вокруг dscl, чтобы перебрать используемые в настоящий момент идентификаторы, перечисленные в списке, а затем выдать первый идентификатор под 500, который еще не используется?
Обновление № 1 (17 февраля 2013 г.)
Я нашел несколько очень полезных сценариев на http://wiki.awkwardtv.org/wiki/Manage_users_and_groups_scripts, которые я смог набрать до такой степени, что я мог получить первый доступный идентификатор выше заданного числа, но у меня все еще нет способ написания сценариев, чтобы перестать смотреть за пределы определенного верхнего предела, например, 500.
#!/bin/sh
continue="no"
number_used="dontknow"
fnumber=300
user_id=0
until [ $continue = "yes" ] ; do
if [ `dscl . -list /Users UniqueID | awk '{print $2, "\t", $1}' | sort -ug | grep -c "$fnumber"` -gt 0 ] ; then
number_used=true
else
number_used=false
fi
if [ $number_used = "true" ] ; then
fnumber=`expr $fnumber + 1`
else
user_id="$fnumber"
continue="yes"
fi
done;
echo "Next available user_id: $user_id"
Обновление № 2 (17 февраля 2013 г.)
Я полагаю, что мог бы работать в обратном направлении, но все же, что, если каждый идентификатор пользователя от 500 до 0 взят? Мне все еще нужно установить нижнюю границу, чтобы выйти из грязной ситуации с отрицательным идентификатором.
#!/bin/sh
continue="no"
number_used="dontknow"
fnumber_work_backwards_from=500
fnumber=$fnumber_work_backwards_from
user_id=0
until [ $continue = "yes" ] ; do
if [ `dscl . -list /Users UniqueID | awk '{print $2, "\t", $1}' | sort -ug | grep -c "$fnumber"` -gt 0 ] ; then
number_used=true
else
number_used=false
fi
if [ $number_used = "true" ] ; then
fnumber=`expr $fnumber - 1`
else
user_id="$fnumber"
continue="yes"
fi
done;
echo "First available user_id which is closest to and lower than $fnumber_work_backwards_from: $user_id"