Ich möchte ein Skript erstellen, um zu überprüfen, ob ein Benutzer vorhanden ist. Ich verwende die folgende Logik:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Wenn der Benutzer existiert, haben wir Erfolg, sonst existiert der Benutzer nicht. Ich habe den obigen Befehl wie folgt in das Bash-Skript eingefügt:
#!/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
Jetzt sagt mein Skript immer, dass der Benutzer existiert, egal was passiert:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Warum wird die obige Bedingung immer als WAHR bewertet und es wird angegeben, dass der Benutzer vorhanden ist?
Wo gehe ich falsch?
AKTUALISIEREN:
Nachdem ich alle Antworten gelesen hatte, fand ich das Problem in meinem Skript. Das Problem war die Art und Weise, wie ich die getent
Ausgabe umleitete . Also habe ich alles Umleitungsmaterial entfernt und die getent
Zeile so aussehen lassen:
getent passwd $user > /dev/null
Jetzt funktioniert mein Skript einwandfrei.
getent
und Ihrer if
Anweisung? Dies würde dazu führen $?
, dass der Exit-Status von echo
und nicht Ihr Anruf bei überprüft wird getent
.
2>&1
statt 2&>1
.
$1
nicht festgelegt, gibt die if-Anweisung true zurück. Nach meinen Tests wäre die Lösung, $1
in doppelte Anführungszeichen zu setzen : getent passwd "$1" > /dev/null 2&>1
.
$?
Sie den Rückkehrcode destest
Befehls. Siehe Antwort unten.