Tener problemas para permitir solo un argumento

Tener problemas para permitir solo un argumento

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 billcomo 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 $useridcadena 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 passwdbase 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

información relacionada