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 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 > () > 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
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 () 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.- > >
Re: problema al programar scripts en bash.
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.-
Re: problema al programar scripts en bash.
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.-
Re: problema al programar scripts en bash.
Puede ser que a uno le pusiste return 0 y al otro exit 0. Si. Le pones a los dos return 0 El 12 de marzo de 2019 4:42:24 p. m. GMT-03:00, Fran Torres escribió: >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. -- Enviado desde mi dispositivo Android con K-9 Mail. Por favor, disculpa mi brevedad.
problema al programar scripts en bash.
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.