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.- > >