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 bill
als 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 $userid
Zeichenfolge 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 passwd
Datenbank ü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