Voglio creare uno script per verificare se esiste un utente. Sto usando la logica qui sotto:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Quindi se l'utente esiste, allora abbiamo successo, altrimenti l'utente non esiste. Ho messo sopra il comando nello script bash come di seguito:
#!/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
Ora, il mio script dice sempre che l'utente esiste indipendentemente da cosa:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Perché la condizione precedente valuta sempre come VERA e dice che l'utente esiste?
Dove sto sbagliando?
AGGIORNARE:
Dopo aver letto tutte le risposte, ho riscontrato il problema nella mia sceneggiatura. Il problema era il modo in cui stavo reindirizzando l' getentoutput. Quindi ho rimosso tutte le cose di reindirizzamento e ho fatto getentapparire la linea in questo modo:
getent passwd $user > /dev/null
Ora la mia sceneggiatura funziona bene.
getente la tua ifdichiarazione? Ciò provocherebbe il $?controllo dello stato di uscita di echo, non la chiamata a getent.
2>&1invece di 2&>1.
$1non è impostato, l'istruzione if restituirà true. Dal mio test, la soluzione sarebbe quella di avvolgere $1tra virgolette: getent passwd "$1" > /dev/null 2&>1.
$?ottieni il codice di ritorno deltestcomando. Vedi la risposta sotto.