Wie kann ich den Vornamen aus dem Nachnamen entfernen, wenn die Länge unbekannt ist?

Wie kann ich den Vornamen aus dem Nachnamen entfernen, wenn die Länge unbekannt ist?

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 $nameist Amber 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 passwdals direkt lesen /etc/passwd. getentFunktioniert 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/passwdauch 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 cutkönnte auch durch eine Worttrennung oder ersetzt werden read, indem man es IFSauf 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, cutum 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"!

verwandte Informationen