Linux en Espanol
 
Comparaci?n de variables en BASH (tema #24698)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
ForestuX
Forista
Registrado: 2013-04-13
Mensajes: 3

Publicado: 2013-04-13 17:16:30    Asunto: Comparaci?n de variables en BASH

Buenas, y enhorabuena por el foro.
Gracias de antemano por las respuestas.
Acabo de inciarme en el mundo de shell scripting (estoy estudiando lpic, a mi edad, que ya peino canas), y me canso de darle vueltas a un ejercicio propuesto, al que no soy capaz de encontrar soluci?n:
Se trata de comparar una variable $newuser (definida con read para tomarla del teclado) y compararla con otra, que tomar? el valor de todos y cada uno de los usuarios ya presentes en el sistema, que he definido as?: user=`cat /etc/passwd | cut -d ":" -f 1`
La idea es comparar una variable con otra, de modo que si se encuentra una coincidencia (el usuario $newuser ya existe) se arroje un mensaje, y se salga; en caso de no haber ninguna coincidencia ($newuser a?n no es usuario del sistema) se crear? el usuario en cuesti?n.
[code:1:243c04ac30]

#!/bin/sh
# Script para crear usuarios en el sistema
# Lo primero, limpiar la shell
clear
# Confirmamos que s?lo el superusuario pueda ejecutar el script
if [ $UID != 0 ];
then
echo "Ejecute este script como superusurio, por favor."
echo "Abandonando la ejecuci?n del script..."
exit 1
fi
# Definimos la variable user para poder compararla con el nombre de nuevo usuario m?s adelante
# cortamos la salida del fichero /etc/passwd por el primer caracter dos puntos (:), de modo que salida es un listado de todos los usuarios actuales del sistema.
user=`cat /etc/passwd | cut -d ":" -f 1`
# La funci?n usuario ser? llamada en caso de querer crear un usuario.
usuario(){
echo "A?adiendo el usuario $newuser al sistema..."
adduser $newuser
echo "El usuario $newuser ha sido a?adido al sistema."
}
# Leemos el nombre del nuevo usuario introducido por el teclado
read -p "Introduzca el nombre del usuario que desea crear:" newuser
if test -z $newuser
then
echo "Necesito un nombre v?lido"
exit 1
else
####AQUI YA NO PEGO NADA PORQUE NO SABR?A NI QU? PEGAR DE TODO LO QUE HE PROBADO
fi
exit o

[/code:1:243c04ac30]
AnimAlf
Forista


Registrado: 2008-08-18
Mensajes: 786

Publicado: 2013-04-13 23:35:10    Asunto:

Hola, bienvenido por estos lares.

[code:1:a841a73ebe]user=`cat /etc/passwd | cut -d ":" -f 1`[/code:1:a841a73ebe]
te crea una s?la variable, que contiene un s?lo valor, todos los usuarios. As? va a ser un poco dif?cil comparar, si en su lugar haces

[code:1:a841a73ebe]user=(`cat /etc/passwd | cut -d ":" -f 1`)[/code:1:a841a73ebe]
entonces ya tienes un array con el n?mero de usuarios y puedes recorrerlo con las funciones de array por ejemplo all? d?nde no pegas nada, pon

[code:1:a841a73ebe] echo "Existen " $(( ${#user[@]} )) " usuarios"

for u in "${user[@]}"
do
if [ $u = $newuser ]; then
existe=true
fi
done

if [ -z $existe ]; then
echo $newuser " no existe"
else
echo $newuser " existe"
fi[/code:1:a841a73ebe]
[i:a841a73ebe]Salud[/i:a841a73ebe][b:a841a73ebe]OS[/b:a841a73ebe]
ForestuX
Forista
Registrado: 2013-04-13
Mensajes: 3

Publicado: 2013-04-14 09:49:51    Asunto:

Ummm!!
Muhcas gracias, y tambi?n por la pronta respuesta :)
La verdad es que la funci?n la hab?a hecho, de mil maneras, y, evidentemente, los resultados no eran los esperados...
Ya veo que el problema estaba en la variable $user, a la que no prest? m?s atenci?n desde que la declar?...
Est? visto que el error est? donde uno menos se lo espera.
Con todo, me has hecho el ejercicio completo... (Procurar? no mirar m?s a la funci?n a ver si soy capaz yo mismo de hacerla igualita):
Muchas gracias!!
ForestuX
Forista
Registrado: 2013-04-13
Mensajes: 3

Publicado: 2013-04-17 21:13:40    Asunto:

As? lo he dejado... Me has sido de gran ayuda.
[code:1:48b1e139ad]#!/bin/sh
# Script para crear usuarios/grupos en el sistema.
clear
date=`date +%D-%H:%M`
if [ $UID != 0 ]; then
echo "Ejecute este script como superusuario, por favor."
echo "Abandonando la ejecuci?n del script..."
echo $date "El usuario con UID" $UID " ha intentado ejecutar el script de creaci?n de usuarios/grupos" >> /tmp/.salida.log
exit 1
fi
user=(`cat /etc/passwd | cut -d ":" -f 1`)
group=(`cat /etc/group | cut -d ":" -f 1`)

usuario(){
echo "El usuario" $newuser " no existe."
echo "A?adiendo el usuario" $newuser " al sistema..."
adduser $newuser
echo "El usuario" $newuser " ha sido a?adido al sistema."
}
grupo(){
echo "El grupo" $newgroup " no existe."
echo "A?adiendo el grupo" $newgroup " al sistema..."
groupadd $newgroup
echo "El grupo" $newgroup " ha sido a?adido al sistema"
}
nousuario(){
echo "El usuario" $newuser " ya existe."
echo "No se hace nada para " $newuser"."
}
nogrupo(){
echo "El grupo" $newgroup " ya existe."
echo "No se hace nada para " $newgroup"."
}
read -p "Introduzca el nombre del usuario que desea crear:" newuser
read -p "Introduzca el nombre del grupo que desea crear:" newgroup
for u in "${user[@]}"
do
if [ $u = $newuser ]; then
existeuser=true
fi
done
for g in "${group[@]}"
do
if [ $g = $newgroup ]; then
existegroup=true
fi
done
if [ $g = $newgroup ]; then
existegroup=true
fi
if [ -z $existeuser ]; then
if [ -z $existegroup ]; then
usuario
grupo
echo $date "Usuario:ok " $newuser " ; grupo:ok " $newgroup >> ~/salida.log
else
usuario
nogrupo
echo $date "Usuario:ok " $newuser " ; grupo: fail " $newgroup >> ~/salida.log
fi
else
if [ -z $existegroup ]; then
nousuario
grupo
echo $date "Usuario:fail " $newuser " ; grupo: ok " $newgroup >> ~/salida.log
else
nousuario
nogrupo
echo $date "Usuario:fail " $newuser " ; grupo:fail " $newgroup >> ~/salida.log
fi
fi
if [ -f /tmp/.salida.log ]; then
cat /tmp/.salida.log >> ~/salida.log
rm /tmp/.salida.log
fi
echo $date
exit 0[/code:1:48b1e139ad]
Anonymous
Forista
Registrado: 2003-10-21
Mensajes: 11749

Publicado: 2014-12-22 09:27:26    Asunto: sultan

Es cierto, me habia pasado por ese tema pero no cai en ello. Ahora funciona perfecto y incluso lo he mejorado para que si el fichero de jugadores esta vacio no haga nada.
Gracias por la ayuda.





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries