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 getentsalida. Así que eliminé todas las cosas de redirección e hice que la getentlínea se viera así:
getent passwd $user > /dev/null
Ahora mi script está funcionando bien.
getenty su ifdeclaración? Eso haría $?que verifique el estado de salida de echo, no su llamada a getent.
2>&1lugar de 2&>1.
$1no se establece, la instrucción if devolverá verdadero. De mis pruebas, la solución sería para envolver $1entre comillas dobles: getent passwd "$1" > /dev/null 2&>1.
$?usas obtienes el código de retorno deltestcomando. Ver la respuesta a continuación.