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 getentsaída. Então eu removi todo o material de redirecionamento e fiz a getentlinha ficar assim:
getent passwd $user > /dev/null
Agora meu script está funcionando bem.
getente a sua ifdeclaração? Isso causaria $?a verificação do status de saída echoe não da sua ligação getent.
2>&1vez de 2&>1.
$1não estiver definido, a instrução if retornará true. Do meu testes, solução seria para embrulhar $1entre aspas: getent passwd "$1" > /dev/null 2&>1.
$?você obtém o código de retorno dotestcomando. Veja a resposta abaixo.