Estou tentando escrever um script bash simples no qual o usuário insere seu nome de usuário e é cumprimentado, dependendo da hora do dia, pelo sobrenome. Atualmente tenho o seguinte:
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)
etc etc.
Consegui cortar as 3 vírgulas do final do nome que está aí, mas quero poder cortar o primeiro nome.
Por exemplo:
- O
$name
éAmber Martin,,,
. - Eu reduzi para
Amber Martin
. - Preciso reduzir ainda mais
Martin
. - E isso precisa funcionar com qualquer nome.
Responder1
Melhor usar getent passwd
do que ler /etc/passwd
diretamente. getent
também funciona com LDAP, NIS e outros. Eu acho que existe na maioria dos Unixes. (Meu OS X não tem, mas /etc/passwd
também não tem minha conta, então...)
name=$(getent -- passwd "$USER" | cut -d: -f5)
O processamento da string pode ser feito com o shellexpansão de parâmetros, estes são compatíveis com 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"
Utilize ${name#* }
para retirar até o primeiro espaço. (Espero que ninguém tenha um sobrenome dividido em duas partes, com espaço entre elas).
O cut
também pode ser substituído por divisão de palavras ou read
, configurando IFS
dois pontos.
Responder2
#!/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"
Responder3
Depois de ter oCampo GECOS (comentário), você pode simplesmente realizar outro cut
para remover os campos (vazios no seu caso) de localização e número de telefone, desta vez com ,
o separador:
name=$(getent passwd "$USER" | cut -d: -f5 | cut -d, -f1)
echo "Hello, ${name##* }-san!"
Vou deixar isso como um exercício para lidartodas as diferentes possibilidadesdo que é um "sobrenome"!