Siguiendo los comentarios de Matias, quedaría más o menos así:

#!/bin/bash
if [ $# -ne 1 ]; then
    echo "error, se esperaba un argumento"
    exit 1
fi

login=$1
userline=$(grep "^$login:" /etc/passwd)
login=$(echo $userline | cut -d: -f1)
uid=$(echo $userline | cut -d: -f3)
gid=$(echo $userline | cut -d: -f4)
dir=$(echo $userline | cut -d: -f6)
shll=$(echo $userline | cut -d: -f7)

if [ -z "$userline" ]; then
    echo "error, no se ha encontrado el usuario especificado"
    exit 2
fi

printf "La información del usuario $login, es:\n UID: $uid \n GID: $gid \n
Directorio home: $dir \n Shell de sistema: $shll \n"

He sacado el* printf *del else porq si todo va bien no entra en el bucle y
creo que queda más limpio que haya una salida por defecto a OK, pero eso ya
va en gustos...

Slds,

El mié., 13 mar. 2019 a las 12:39, Matias Mucciolo (<mmucci...@suteba.org.ar>)
escribió:

>
> On Wednesday, March 13, 2019 8:28:37 AM -03 Matias Mucciolo wrote:
> > On Tuesday, March 12, 2019 8:42:24 PM -03 Fran Torres wrote:
> > > Buenas chicos,
> > >
> > > ¿algún administrador de sistemas linux/programador de scripts en
> > > bash-shell por la sala?.
> > >
> > >   Precisamente eso es lo que estudio como bien ya sabreis y, en clase
> > >
> > > de sistemas operativos estamos haciendo programación básica de scripts
> > > en shell. Mäs concretamente, estamos haciendo funciones. Os voy a
> > > poner un código de ejemplo y debajo de él, un código alternativo. Al
> > > final del segundo va la duda.
> > >
> > > #!/bin/bash
> > > function ShowUser(){
> > > if [ $# -ne 1 ]; then
> > > echo "error, se esperaba un argumento"
> > > return 1
> > > fi
> > > login=$1
> > > cmd=$(grep "^$login:" /etc/passwd)
> > > echologin=$(echo $cmd /etc/passwd | cut -d: -f1)
> > > uid=$(echo $cmd /etc/passwd | cut -d: -f3)
> > > gid=$(echo $cmd /etc/passwd | cut -d: -f4)
> > > dir=$(echo $cmd /etc/passwd | cut -d: -f6)
> > > shll=$(echo $cmd /etc/passwd | cut -d: -f7)
> > > if [ -z $cmd ]; then
> > > echo "no se ha encontrado el usuario introducido"
> > > else
> > > echo "la información del usuario $echologin, es:\n uid: $uid \n gid:
> > > $gid\n Directorio home: $dir|n shell de sistema: $shll\n"
> > > return 0
> > > fi
> > > }
> > >
> > > Ahora, el siguiente código:
> > >
> > > #!/bin/bash
> > > if [ $# -ne 1 ]; then
> > > echo "error, se esperaba un argumento"
> > > exit 1
> > > fi
> > > login=$1
> > > cmd=$(grep "^$login:" /etc/passwd)
> > > echologin=$(echo $cmd /etc/passwd | cut -d: -f1)
> > > uid=$(echo $cmd /etc/passwd | cut -d: -f3)
> > > gid=$(echo $cmd /etc/passwd | cut -d: -f4)
> > > dir=$(echo $cmd /etc/passwd | cut -d: -f6)
> > > shll=$(echo $cmd /etc/passwd | cut -d: -f7)
> > > if [ -z $cmd ]; then
> > > echo "error, no se ha encontrado el usuario especificado"
> > > exit 2
> > > else
> > > echo "la información del usuario $echologin, es:\n uid: $uid \n gid:
> > > $gid\n Directorio home: $dir|n shell de sistema: $shll\n"
> > > exit 0
> > > fi
> > >
> > > Como podeis observar, ambos scripts son idénticos, salvo por que uno
> > > lleva una función llamada showUSer, y sustituye los "exit" por
> > > "return".
> > > ambos scripts tienen el mismo comportamiento (código de status 0 por
> > > lo que la ejecución es correcta)
> > > Pero, ahora viene la salvedad del asunto.
> > > El primer script, pese a terminar su ejecución con código de error 0,
> > > no muestra absolutamente nada por stdout sobre la información que se
> > > le pide (los echos).
> > > Sin embargo, el segundo script si que lo muestra.
> > >
> > > Alguien sabría decirme por qué, o donde estoy fallando yo?
> > >
> > > Fran.
> >
> > Buenas
> > es que en el primer script solo esta la funcion...
> > nunca la llamas...
> > ejemplo agregale al primer script abajo de todo
> >
> > ShowUser USER
> >
> >
> > USER = a un usuario de sistema o algo.
> > y te va andar.
> >
> > si pones solo la funcion sin ningun usuario
> > te va a devolver el error:
> >
> > 'echo "error, se esperaba un argumento"'
> >
> > no se si entendio pero creo que si..
> > en definitiva tenes que llamar la funcion cuando
> > la queres usar...
> >
> > saludos.
> > Matias.-
>
> y mirando bien las lineas de 'echo' ejemplo la siguiente:
>
> uid=$(echo $cmd /etc/passwd | cut -d: -f3)
>
> no hace falta la parte de /etc/passwd
>
> uid=$(echo $cmd | cut -d: -f3)
> seria la forma correcta.
>
> despeus tenes otros errores como mal un enter '|n'
> y si queres que te tome los enters o nueva linea
> tenes que usar la opcion -e de echo..
>
> echo -e "hola\nchau"
>
> pero esto tiene un problema a veces la funcion echo
> puede cambiar en diferentes sistemas operativos etc.
> y puede no tener la opcion '-e'
> por lo cual se recomienda usar printf..ejemplo
>
> printf "hola\nchau\n"
>
> espero que te sirva..ya que estas aprendiendo.
>
> saludos.
> Matias.-
>
>

Responder a