Làm thế nào chúng ta có thể viết một tập lệnh xung quanh dscl để lặp qua các ID hiện được liệt kê đang sử dụng và sau đó nhổ ra id đầu tiên dưới 500 chưa được sử dụng?
Cập nhật số 1 (ngày 17 tháng 2 năm 2013)
Tôi đã tìm thấy một số tập lệnh rất hữu ích trên http://wiki.awkwardtv.org/wiki/Manage_usftimeand_groups_scripts mà tôi có thể hạ thấp đến mức tôi có thể nhận được ID có sẵn đầu tiên cao hơn số lượng nhất định nhưng tôi vẫn không có một cách viết kịch bản để ngừng tìm kiếm vượt quá giới hạn trên nhất định như 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"
Cập nhật số 2 (ngày 17 tháng 2 năm 2013)
Tôi cho rằng tôi có thể làm việc ngược nhưng vẫn thế nào nếu mọi userid từ 500 đến 0 được lấy? Tôi vẫn cần đặt một mức thấp hơn để thoát khỏi tình huống ID tiêu cực lộn xộn.
#!/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"