Soy un principiante en las secuencias de comandos Bash y mi secuencia de comandos no se comporta correctamente. No sé cómo solucionarlo ni la forma correcta de codificarlo. El usuario sólo debería poder introducir un argumento. ( $ nowOn f132a99
) Si ingresa más de un argumento, aparecerá el mensaje Please enter a single, valid user id: "
No estoy seguro de cómo solucionar este problema.
$ nowOn f132a99 = Salida correcta
$ nowOn f132a99 f132a98 = Error esperado en el operador binario de la línea 1
$ nowOn f132a99 f132a98 f132a97 = Error en la línea 1 Demasiados argumentos
if [ -z "$@" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$@"
fi
#user validation check
if ! grep -q "$userid" /etc/passwd >/dev/null 2>&1;then
echo
echo "The user you entered, $userid is not a valid user on this system."
exit 2
else
#login check
if ! who | grep "$userid" >/dev/null 2>&1;then
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is NOT currently logged on
exit 1
else
#login check
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is currently logged on.
exit 0
fi
fi
También probé el siguiente código a continuación, pero si ingresa más de un argumento ( nowOn f132a99 f132a97
), solo mostrará los resultados de f132a99 e ignorará el resto, y no hará eco.Please enter a single, valid user id:
if [ -z "$1" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
Respuesta1
Sí, su prueba [ -z "$@" ]
no funciona como esperaba. Se "$@"
expandirá a cada argumento individual de la línea de comando, citado, lo que le brinda una prueba que esencialmente se parece [ -z "f132a99" "f132a98" "f132a97" ]
a tres argumentos.
Lo que debes hacer, si quieres que el usuario solo dé un argumento, es exactamente lo que mencionas.en tu propia respuesta, es decir, utilice una prueba como [ "$#" -ne 1 ]
para comprobar si hay entradas no válidas.
Sin embargo, existe otra opción, y es considerartodode los argumentos dados como ID de usuario y recorralos:
if [ "$#" -eq 0 ]; then
echo 'No user ID given' >&2
exit 1
fi
for userid do
# code to process "$userid" goes here
done
Otras notas sobre su código:
La prueba de identificación de usuario válida es defectuosa. Considere un sistema donde no hay ningún usuario llamado bill
, pero donde hayesa billy
. Al ingresar bill
como ID de usuario no se detectará como una ID de usuario no válida grep -q "$userid" /etc/passwd
(este comando posiblemente también generaría un error si la $userid
cadena comenzara con un guión).
Sería mejor probar getent -- passwd "$userid"
y realizar todas las operaciones relacionadas con la obtención de datos de la passwd
base de datos a través de getent passwd
.
Tienes un problema similar con who | grep "$userid"
, que se escribe mejor como who | grep -q "^$userid\>"
.
Mencioné estas cosasen mi respuesta a tu pregunta anterior.
Respuesta2
Lo resolvió usando:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi