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

Re: problema al programar scripts en bash.



BUENas,

Os cuento que ya ha sido solucionado. Resulta que los dos códigos eran
correctos, (centrémonos en el que empieza por function, pues es con el
que estamos trabajando) y, salvo corregir el par de bugs de que $1
debía ir encapsulado "$1" y que $cmd /etc/passwd se repetía más que el
ajo sin ser necesario, la forma de que la función mostrase algo útil
(lo que se le pedía) era la siguiente:

. nombrefichero
ejemplo:

si el fichero se llama showuser, pues había que poner directamente en
la consola:

. showuser
y seguidamente y por ejemplo:

ShowUser root
  Al hacer esto (al escribir . showuser) todo el contenido del fichero
queda cargado en el sistema, de modo que solo queda llamarlo como si
de cualquier comando de /bin se tratase.
  Pero, en este caso, llamando directamente a la función.
Fran.


El 14/3/19, Alba Ferri <branvan2k@gmail.com> escribió:
> 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: