Как удалить имя из фамилии, если ее длина неизвестна?

Как удалить имя из фамилии, если ее длина неизвестна?

Я пытаюсь написать простой скрипт bash, в котором пользователь вводит свое имя пользователя, затем его приветствуют, в зависимости от времени суток, по его фамилии. В настоящее время у меня есть следующее:

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)

и т.д. и т.п.

Мне удалось вырезать три запятые в конце имени, но я хочу иметь возможность вырезать и первое имя.

Например:

  • Это .$nameAmber Martin,,,
  • Я сократил до Amber Martin.
  • Мне нужно сократить еще больше до Martin.
  • И это должно работать с любым именем.

решение1

Лучше использовать getent passwd, чем читать /etc/passwdнапрямую. getentТакже работает с LDAP, NIS и т. п. Я думаю, что он есть в большинстве Unix. (В моей OS X его нет, но в ней нет /etc/passwdи моей учетной записи, так что...)

name=$(getent -- passwd "$USER" | cut -d: -f5)

Обработка строк может быть выполнена с помощью оболочкирасширение параметра, они совместимы с POSIX:

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"

Используйте ${name#* }для удаления до первого пробела. (Просто надеюсь, что ни у кого нет двухчастной фамилии с пробелом между ними).

Также можно cutзаменить на разделение слов или read, установив IFSдвоеточие.

решение2

#!/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"

решение3

Как только у вас будетПоле GECOS (комментарий), вы можете просто выполнить еще одно действие, cutчтобы удалить (пустые в вашем случае) поля местоположения и номера телефона, на этот раз используя ,в качестве разделителя:

name=$(getent passwd "$USER" | cut -d: -f5 | cut -d, -f1)
echo "Hello, ${name##* }-san!"

Я оставлю это как упражнение, с которым можно будет разобраться.все различные возможностичто такое «фамилия»!

Связанный контент