[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: problema al programar scripts en bash.



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 (<mmucciolo@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.-


Reply to: