長さがわからない場合は、姓から名前を削除する方法は?

長さがわからない場合は、姓から名前を削除する方法は?

ユーザーがユーザー名を入力し、姓に基づいて時間をかけて挨拶する単純な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/passwdgetentLDAP、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#* }最初のスペースまで削除を使用してください。 (その間にスペースがある2つの部分の城を持つ人がいないことを願っています。)

スプレーまたはコロンに設定して置き換えることもできますcutreadIFS

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

練習で処理します。すべて異なる可能性「城」とは何ですか!

関連情報