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 getentsortie. J'ai donc supprimé tous les éléments de redirection et j'ai fait getentressembler la ligne à ceci:
getent passwd $user > /dev/null
Maintenant, mon script fonctionne correctement.
getentet votre ifinstruction? Cela entraînerait la $?vérification de l'état de sortie de echo, pas de votre appel à getent.
2>&1au lieu de 2&>1.
$1n'est pas défini, l'instruction if retournera true. De mes tests, la solution serait d'envelopper $1dans des guillemets doubles: getent passwd "$1" > /dev/null 2&>1.
$?vous obtenez le code retour de latestcommande. Voir la réponse ci-dessous.