Chcę utworzyć skrypt, aby sprawdzić, czy użytkownik istnieje. Używam poniższej logiki:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Więc jeśli użytkownik istnieje, to mamy sukces, w przeciwnym razie użytkownik nie istnieje. Powyższe polecenie umieściłem w skrypcie bash, jak poniżej:
#!/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
Teraz mój skrypt zawsze mówi, że użytkownik istnieje bez względu na wszystko:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Dlaczego powyższy warunek zawsze jest PRAWDZIWY i mówi, że użytkownik istnieje?
Gdzie się mylę?
AKTUALIZACJA:
Po przeczytaniu wszystkich odpowiedzi znalazłem problem w swoim skrypcie. Problem polegał na sposobie przekierowywania getent
danych wyjściowych. Usunąłem więc wszystkie przekierowania i sprawiłem, że getent
linia wygląda tak:
getent passwd $user > /dev/null
Teraz mój skrypt działa dobrze.
getent
a if
instrukcją? To spowodowałoby $?
sprawdzenie statusu wyjścia echo
, a nie twojego wywołania getent
.
2>&1
zamiast 2&>1
.
$1
nie jest ustawiony, instrukcja if zwróci wartość true. Z moich badań, rozwiązaniem byłoby zawinąć $1
w cudzysłowach: getent passwd "$1" > /dev/null 2&>1
.
$?
, otrzymasz kod zwrotnytest
polecenia. Zobacz odpowiedź poniżej.