Isso deve funcionar para encontrar o que você precisa. A função find_next_userid
abaixo pesquisará entre dois números, inclusive, para localizar o primeiro ID do usuário não utilizado. Para o seu caso, use apenas 0
e 499
, mostrados abaixo. A função retorna uma string vazia se não puder encontrar nenhum slot vazio, então você precisa verificar isso antes de usar o valor echo
ed (mostrado abaixo também).
Eu percebo que isso não usa dscl, mas isso deve funcionar e ser mais portátil. [Atualização: versão adicionada usando dscl.]
Tecnicamente, estou usando o bash, então observei isso; Eu não tenho certeza se trabalharia em sh ou não.
Testado no OS X 10.9.4.
#!/bin/bash
user_exists()
{
username=$1
if id -u $username >/dev/null 2>&1; then
return 0
else
return -1
fi
}
user_exists_dscl()
{
username=$1
user_found='dscl . -search /Users UniqueID $username | awk 'FNR == 2 {print $1}''
if [ "${user_found}" != "" ] ; then
return 0
else
return -1
fi
}
find_next_userid()
{
low=$1
hi=$2
for curr in 'seq $low $hi';
do
if ! (user_exists $curr) ; then
echo $curr
break
fi
done
echo ""
}
FIRST_UNUSED_USERID='find_next_userid 0 499'
if [ "$FIRST_UNUSED_USERID" != "" ]; then
echo "Do your stuff here!"
else
echo "No unused userid found!"
fi
Editar: Esqueceu de incluir user_exists()
. Atualizado para observar que essa solução não usa dscl, mas ainda funciona. Acho que posso ter uma solução usando dscl em breve.
Editar 2: adicionado user_exists_dscl
. Substitua as chamadas para user_exists
por user_exists_dscl
se realmente precisar usar dscl
em vez de id
.