Quero criar um script para verificar se existe um usuário. Estou usando a lógica abaixo:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Portanto, se o usuário existe, temos sucesso, caso contrário, o usuário não existe. Eu coloquei o comando acima no script bash como abaixo:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Agora, meu script sempre diz que o usuário existe, não importa o que:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Por que a condição acima sempre avalia como VERDADEIRA e diz que o usuário existe?
Onde eu estou errando?
ATUALIZAR:
Depois de ler todas as respostas, encontrei o problema no meu script. O problema era o modo como eu estava redirecionando a getent
saída. Então eu removi todo o material de redirecionamento e fiz a getent
linha ficar assim:
getent passwd $user > /dev/null
Agora meu script está funcionando bem.
getent
e a sua if
declaração? Isso causaria $?
a verificação do status de saída echo
e não da sua ligação getent
.
2>&1
vez de 2&>1
.
$1
não estiver definido, a instrução if retornará true. Do meu testes, solução seria para embrulhar $1
entre aspas: getent passwd "$1" > /dev/null 2&>1
.
$?
você obtém o código de retorno dotest
comando. Veja a resposta abaixo.