obligada > linux.debian.user.spanish

Fran Torres (12-03-2019, 21:50)
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.
Marcxelo (13-03-2019, 04:40)
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 <frantorresgallego> escribió:
[..]
Matias Mucciolo (13-03-2019, 13:30)
On Tuesday, March 12, 2019 8:42:24 PM -03 Fran Torres wrote:
[..]
> 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.-
Matias Mucciolo (13-03-2019, 13:40)
On Wednesday, March 13, 2019 8:28:37 AM -03 Matias Mucciolo wrote:
[..]
> 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.-
Alba Ferri (14-03-2019, 12:10)
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>)
escribió:
[..]
Fran Torres (14-03-2019, 16:10)
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> escribió:
[..]
Temas Similares