長さが不明な場合、姓から名を削除するにはどうすればよいですか?

長さが不明な場合、姓から名を削除するにはどうすればよいですか?

ユーザーがユーザー名を入力すると、時間帯に応じて姓で挨拶される簡単な 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 つのコンマは削除できましたが、名前を削除できるようにしたいと考えています。

例えば:

  • $nameですAmber Martin,,,
  • まで削減しましたAmber Martin
  • さらに削減する必要がありますMartin
  • そして、これはどんな名前でも機能する必要があります。

答え1

直接getent passwd読み取るよりも使用する方がよいでしょう。LDAP 、NIS などでも動作します。ほとんどの Unix に存在すると思います。(私の OS X には存在しませんが、どちらにも私のアカウントがないので...)/etc/passwdgetent/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#* }。(間にスペースがある 2 つの部分から成る姓を持つ人がいないことを祈ります)。

をコロンに設定することで、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!"

それを練習として残しておきますあらゆる可能性「姓」とは何か!

関連情報