Je souhaite créer un script pour vérifier si un utilisateur existe. J'utilise la logique ci-dessous:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Donc, si l'utilisateur existe, alors nous avons du succès, sinon l'utilisateur n'existe pas. J'ai mis la commande ci-dessus dans le script bash comme ci-dessous:
#!/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
Maintenant, mon script dit toujours que l'utilisateur existe quoi qu'il arrive:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Pourquoi la condition ci-dessus évalue-t-elle toujours VRAI et indique-t-elle que l'utilisateur existe?
Où vais-je mal?
METTRE À JOUR:
Après avoir lu toutes les réponses, j'ai trouvé le problème dans mon script. Le problème était la façon dont je redirigeais la getent
sortie. J'ai donc supprimé tous les éléments de redirection et j'ai fait getent
ressembler la ligne à ceci:
getent passwd $user > /dev/null
Maintenant, mon script fonctionne correctement.
getent
et votre if
instruction? Cela entraînerait la $?
vérification de l'état de sortie de echo
, pas de votre appel à getent
.
2>&1
au lieu de 2&>1
.
$1
n'est pas défini, l'instruction if retournera true. De mes tests, la solution serait d'envelopper $1
dans des guillemets doubles: getent passwd "$1" > /dev/null 2&>1
.
$?
vous obtenez le code retour de latest
commande. Voir la réponse ci-dessous.