Quiero crear un script para verificar si existe un usuario. Estoy usando la lógica a continuación:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Entonces, si el usuario existe, entonces tenemos éxito, de lo contrario, el usuario no existe. He puesto el comando anterior en el script bash como se muestra a continuación:
#!/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
Ahora, mi script siempre dice que el usuario existe sin importar qué:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
¿Por qué la condición anterior siempre se evalúa como VERDADERA y dice que el usuario existe?
¿A dónde me estoy yendo mal?
ACTUALIZAR:
Después de leer todas las respuestas, encontré el problema en mi script. El problema era la forma en que estaba redirigiendo la getent
salida. Así que eliminé todas las cosas de redirección e hice que la getent
línea se viera así:
getent passwd $user > /dev/null
Ahora mi script está funcionando bien.
getent
y su if
declaración? Eso haría $?
que verifique el estado de salida de echo
, no su llamada a getent
.
2>&1
lugar de 2&>1
.
$1
no se establece, la instrucción if devolverá verdadero. De mis pruebas, la solución sería para envolver $1
entre comillas dobles: getent passwd "$1" > /dev/null 2&>1
.
$?
usas obtienes el código de retorno deltest
comando. Ver la respuesta a continuación.