Ich bin ein Anfänger bei Linux/Unix. Hier ist meine Aufgabe, sie ist zu lang, um alles hier zu posten:https://i.stack.imgur.com/v2AJR.jpg
Hier ist die Logik, die ich habe:
Dieser Code prüft, ob der Benutzer ein Argument eingegeben hat oder nicht. Ich weiß nicht, was ich unter „sonst“ eintragen soll. Wir haben nie über die „which“-Anweisung gesprochen, die ich hier von einem anderen Benutzer gelernt habe, daher ist nicht davon auszugehen, dass sie verwendet wird. Nur grundlegende Befehle, dies ist keine sehr fortgeschrittene Aufgabe.
if [ $# -ne 1 ]; then
echo Please enter a single, valid user id:
read userid
else
userid=$1
**what goes here?**
fi
Um den vollständigen Namen eines Benutzers anzuzeigen (z. B. Ben Franklin), ist dies der Code, den ich geschrieben und getestet habe:
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
Stellen Sie fest, ob der Benutzer angemeldet ist oder nicht:
Wenn der Benutzer nicht angemeldet ist (gibt Exitcode 1 zurück):who | grep $userid
- Dann zeigen Sie
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
AND an.echo is NOT currently logged on
Beenden Sie das Skript dann mit dem Code 1.
Wenn der Benutzer angemeldet ist (gibt den Exitcode 0 zurück):who | grep $userid
- Dann zeigen Sie
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
AND an.echo is currently logged on
Beenden Sie das Skript dann mit dem Code 0.
Bestimmen, ob ein Benutzer gültig ist:
Wenn der Benutzer ungültig ist (gibt Exitcode 1 zurück):grep $userid /etc/passwd
- Dann sollte es anzeigen
echo "The user you entered, $userid is not a valid user on this system."
Wenn der Benutzer gültig ist (gibt den Exitcode 0 zurück):grep $userid /etc/passwd
Wie schreibe ich dieses Skript? Wie ist die vollständige Struktur? Ich komme bei der Struktur/dem Setup nicht weiter.
Antwort1
Da dies wie eine Aufgabe aussieht, gebe ich Ihnen nur die Werkzeuge und einige Hinweise:
Wenn dem Skript kein Argument übergeben wurde,
$1
ist (das erste Argument des Skripts) leer. Sie können dies mit testen[[ -z $1 ]]
. Wenn Sie einen Fehler fürzu vieleArgumente, testen Sie die Anzahl der Argumente mit[[ $# -eq 1 ]]
(ist für ein einzelnes Argument wahr).Mit dem
gentent passwd "$username"
Befehl kann derpasswd
Eintrag für den Benutzer abgerufen werden$username
. Der Befehl schlägt mit einem Exit-Status ungleich Null fehl, wenn der Benutzer nicht existiert. Das bedeutet, dass Sieif ! getent passwd "$username" >/dev/null; then ...; fi
auf einen nicht vorhandenen Benutzer reagieren können$username
.Das 5. Feld des
passwd
Eintrags für einen Benutzernormalerweiseenthält den vollständigen Namen des Benutzers (es gibt keine Garantie, dass er in der Form „Vorname Nachname“ vorliegt). Der Eintrag enthält möglicherweise zusätzliche Kommas am Ende, die Sie löschen müssen. Sie können die Ausgabe vongetent passwd "$username"
using analysierencut -d: -f 5
, um zum fünften Feld zu gelangen, und dann mit ab dem ersten Komma löschenname=${name%%,*}
.Auf einigen Systemen kann der vollständige Name des Benutzers ein
&
Zeichen enthalten. Auf diesen Systemen sollte dieses&
Zeichen durch den Benutzernamen ersetzt werden (sodass der NameSystem &
für den Benutzeroperator
zu wirdSystem operator
). Ich bin nicht sicher, ob Linux dies im Allgemeinen tut, aber das könnte mit gemacht werdenname=${name/&/$username}
.Das
who
Dienstprogramm gibt eine Liste der aktuell angemeldeten Benutzer aus. Um eine Übereinstimmung$username
damit zu finden, verwenden Siegrep -e "^$username\>"
. Das\>
entspricht dem Ende eines Wortes, sodass zBantony
bei der Suche nicht übereinstimmt oderanton
. in einer Anweisunggrep -q
nützlich ist .if
Dies folgt der Codestruktur:
- Überprüfen und behandeln Sie ungültige Argumente (fehlend: lesen; zu viele: beenden oder einfach zuerst verwenden). Eine
if
Anweisung. - Ungültige Benutzernamen prüfen und behandeln. Eine
if
Anweisung. - Vollständigen Namen des Benutzers abrufen. Variablenzuweisung(en) mit Befehlsersetzung.
- Prüfen, ob Benutzer angemeldet ist (und Ausgabe). Eine
if
Anweisung, ggf. mitelse
Verzweigung.
Ich sehe in diesem Skript keine Schleife, es wird also eine Reihe von if
-Anweisungen und Variablenzuweisungen sein.