
Estoy intentando escribir un script bash simple en el que el usuario ingresa su nombre de usuario y luego se le saluda, según la hora del día, con su apellido. Actualmente tengo lo siguiente:
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étera etcétera.
Logré cortar las 3 comas del final del nombre que están allí, pero quiero poder cortar el primer nombre.
Por ejemplo:
- El
$name
esAmber Martin,,,
. - He reducido a
Amber Martin
. - Necesito reducir más para
Martin
. - Y esto debe funcionar con cualquier nombre.
Respuesta1
Es mejor usarlo getent passwd
que leer /etc/passwd
directamente. getent
También funciona con LDAP, NIS y demás. Creo que existe en la mayoría de los Unix. (Mi OS X no lo tiene, pero tampoco tiene mi cuenta /etc/passwd
, así que...)
name=$(getent -- passwd "$USER" | cut -d: -f5)
El procesamiento de cadenas se puede realizar con el shellexpansión de parámetros, estos son compatibles con 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"
Utilice ${name#* }
para eliminar hasta el primer espacio. (Solo espero que nadie tenga un apellido de dos partes, con espacios entre ellas).
También podría cut
reemplazarse con división de palabras o read
, estableciendo IFS
dos puntos.
Respuesta2
#!/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"
Respuesta3
Una vez que tengas elCampo GECOS (comentario), simplemente puedes realizar otro cut
para eliminar los campos de ubicación y número de teléfono (vacíos en tu caso), esta vez con ,
como separador:
name=$(getent passwd "$USER" | cut -d: -f5 | cut -d, -f1)
echo "Hello, ${name##* }-san!"
Lo dejo como ejercicio para afrontartodas las diferentes posibilidadesde lo que es un "apellido"!