Ich versuche, ein einfaches Bash-Skript zu schreiben, in dem der Benutzer seinen Benutzernamen eingibt und dann, je nach Tageszeit, mit seinem Nachnamen begrüßt wird. Derzeit habe ich Folgendes:
echo Please enter your username
read username
name=$(grep $username /etc/passwd | cut -d ':' -f 5)
h='date +%H'
if [ $h -lt 12]; then
echo Good morning ${name::-3)
usw. usw.
Ich habe es geschafft, die drei Kommas am Ende des Namens abzuschneiden, möchte aber in der Lage sein, den Vornamen abzuschneiden.
Zum Beispiel:
- Das
$name
istAmber Martin,,,
. - Ich habe reduziert auf
Amber Martin
. - Ich muss noch weiter kürzen auf
Martin
. - Und das muss mit jedem Namen funktionieren.
Antwort1
Besser verwenden getent passwd
als direkt lesen /etc/passwd
. getent
Funktioniert auch mit LDAP, NIS und dergleichen. Ich glaube, es existiert in den meisten Unix-Versionen. (Mein OS X hat es nicht, aber mein Konto ist /etc/passwd
auch dort nicht vorhanden, also ...)
name=$(getent -- passwd "$USER" | cut -d: -f5)
Die Stringverarbeitung kann mit der Shell durchgeführt werdenParametererweiterung, diese sind POSIX-kompatibel:
name=${name%%,*} # remove anything after the first comma
name=${name%,,,} # or remove just a literal trailing ",,,"
name=${name##* } # remove from start until the last space
echo "hello $name"
Verwenden Sie es ${name#* }
zum Entfernen bis zum ersten Leerzeichen. (Hoffen Sie nur, dass niemand einen zweiteiligen Nachnamen mit einem Leerzeichen dazwischen hat.)
Das cut
könnte auch durch eine Worttrennung oder ersetzt werden read
, indem man es IFS
auf einen Doppelpunkt setzt.
Antwort2
#!/bin/bash
#And also /bin/sh looks like to be compatible in debian.
echo "Hmmm... Your username looks like to be $USER"
name="$(getent passwd $USER | cut -d: -f5 | cut -d, -f1)"
echo "Your full name is $name"
surname="$(echo $name | rev | cut -d' ' -f1 | rev)"
echo "Your surname is $surname"
echo "thank your for using only cut and rev to do that..."
echo "But i am sure there is a better way"
Antwort3
Sobald Sie dieGECOS (Kommentar) Feld, können Sie einfach einen weiteren ausführen, cut
um die (in Ihrem Fall leeren) Standort- und Telefonnummer-Felder zu entfernen, dieses Mal mit ,
als Trennzeichen:
name=$(getent passwd "$USER" | cut -d: -f5 | cut -d, -f1)
echo "Hello, ${name##* }-san!"
Ich werde es als Übung überlassen, damit umzugehenalle Möglichkeitenwas ist ein "Nachname"!