ユーザーがユーザー名を入力すると、時間帯に応じて姓で挨拶される簡単な 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/passwd
getent
/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
単語分割または に置き換えることもできます。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!"
それを練習として残しておきますあらゆる可能性「姓」とは何か!