Probleme beim Zulassen nur eines Arguments

Probleme beim Zulassen nur eines Arguments

Ich bin ein Anfänger in Sachen Bash-Skripting und mein Skript verhält sich nicht richtig. Ich weiß nicht, wie ich es reparieren oder wie ich es richtig codieren soll. Der Benutzer sollte nur ein Argument eingeben können. ( $ nowOn f132a99) Wenn Sie mehr als ein Argument eingeben, wird die Meldung angezeigt: „ Please enter a single, valid user id: "Ich bin nicht sicher, wie ich das beheben kann.“

$ nowOn f132a99 = Korrekte Ausgabe

$ nowOn f132a99 f132a98 = Fehler in Zeile 1 Binäroperator erwartet

$ nowOn f132a99 f132a98 f132a97 = Fehler in Zeile 1, zu viele Argumente

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

Ich habe auch den folgenden Code unten ausprobiert, aber wenn Sie mehr als ein Argument ( nowOn f132a99 f132a97) eingeben, werden nur die Ergebnisse für f132a99 angezeigt und der Rest ignoriert, und es wird kein Echo ausgegeben.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

Antwort1

Ja, Ihr Test [ -z "$@" ]funktioniert nicht wie erwartet. Der Test "$@"wird auf jedes einzelne Befehlszeilenargument erweitert (in Anführungszeichen), sodass Sie einen Test erhalten, der im Wesentlichen wie [ -z "f132a99" "f132a98" "f132a97" ]für drei Argumente aussieht.

Wenn Sie möchten, dass der Benutzer immer nur ein einziges Argument angibt, sollten Sie genau das tun, was Sie erwähnen.in Ihrer eigenen Antwort, d. h. verwenden Sie einen Test, [ "$#" -ne 1 ]um auf ungültige Eingaben zu prüfen.

Es gibt jedoch eine andere Möglichkeit, nämlich die Überlegung,alleder angegebenen Argumente als Benutzer-IDs und führen Sie eine Schleife über sie aus:

if [ "$#" -eq 0 ]; then
    echo 'No user ID given' >&2
    exit 1
fi

for userid do
    # code to process "$userid" goes here
done

Weitere Hinweise zu Ihrem Code:

Der Test für gültige Benutzer-IDs ist fehlerhaft. Stellen Sie sich ein System vor, in dem es keinen Benutzer namens gibt bill, sondernIsta billy. Die Eingabe billals Benutzer-ID würde dies nicht als ungültige Benutzer-ID erkennen grep -q "$userid" /etc/passwd(dieser Befehl würde möglicherweise auch einen Fehler generieren, wenn die $useridZeichenfolge mit einem Bindestrich beginnen würde).

Es wäre besser getent -- passwd "$userid", mit zu testen und alle Vorgänge im Zusammenhang mit dem Abrufen von Daten aus der passwdDatenbank über auszuführen getent passwd.

Sie haben ein ähnliches Problem mit who | grep "$userid", das besser als geschrieben wird who | grep -q "^$userid\>".

Ich habe diese Dinge erwähntin meiner Antwort auf Ihre vorherige Frage.

Antwort2

Gelöst mit:

if [ $# -ne 1 ]; then
    echo -n "Please enter a single, valid user id: "
    read userid
else
    userid="$1"
fi

verwandte Informationen