当长度未知时,如何从姓氏中删除名字?

当长度未知时,如何从姓氏中删除名字?

我正在尝试编写一个简单的 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)

等等等等

我已经设法剪掉名字末尾的 3 个逗号,但我希望能够剪掉名字。

例如:

  • 是.$nameAmber Martin,,,
  • 我已经削减到了Amber Martin
  • 我需要进一步减少到Martin.
  • 这需要适用于任何名称。

答案1

使用getent passwd比直接阅读更好/etc/passwdgetent也适用于 LDAP、NIS 等。我认为它存在于大多数 Unix 系统中。 (我的 OS X 没有它,但它也没有我的帐户/etc/passwd,所以......)

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

字符串处理可以通过 shell 来完成参数扩展,这些是 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替换为分词或。readIFS

答案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!"

我将把它作为练习来处理所有不同的可能性什么是“姓”!

相关内容