Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Alfonsoo01 en 7 Enero 2020, 16:18 pm



Título: Necestio ayuda con un programa de Unix shell
Publicado por: Alfonsoo01 en 7 Enero 2020, 16:18 pm
Hola, me encuentro haciendo mi primer programa en Unix shell y estoy un poco bloqueado.

Debo hacer lo siguiente.

 El script implementara un supuesto mecanismo de entrega automatica de
practicas de una asignatura. Las ideas principales son:
-El script a desarrollar entendera que cada practica tiene un identificador de practica.
-El script utilizarŽa el identificador de practica para conocer la informacion relacionada con
dicha prŽactica: ficheros a entregar y directorio de entrega. Informacion que habra que
extraer de un fichero con el mismo nombre que el identificador de practica.
-La labor principal del script sera copiar los ficheros apropiados de un directorio (del supuesto usuario del script) a otro directorio (directorio de entrega).


La siguiente parte explica de forma mas especifica lo que hay que hacer:


El script deberŽa ser ejecutado mediante el siguiente mandato:
minientrega.sh ID_PRACTICA
o bien, en una configuraciŽon mas habitual
./minientrega.sh ID_PRACTICA
ID_PRACTICA es una ristra de caracteres que representa el hipotŽetico nombre de una practica
(por ejemplo prac1, prac7, bucles, etc.).
El script comprobara que el identificador de practica (ID_PRACTICA) es valido, comprobara
que existen los ficheros exigidos para la practica identificada por ese identificador de practica
y finalmente copiara todos los ficheros a un directorio adecuado. El script devolverŽa 0 como
codigo de error para indicar que todo funcion o correctamente o un codigo de error distinto de 0
indicando quŽe error se produjo. El script no esperarŽa ninguna informacion a traves de la entrada
estŽandar ni provocarŽa la emision de mensajes en la salida estŽandar ni en la salida de error excepto
los propios de la ayuda o de la imposibilidad de la entrega, respectivamente.

Mas detalles:


--Si el script ha sido invocado sin argumentos o con mas de uno se informara al usuario
con un mensaje de dos lıneas en la salida de error siguiendo el formato mostrado por este
ejemplo:
1
$ ./minientrega.sh
minientrega.sh: Error(EX_USAGE), uso incorrecto del mandato. "Success"
minientrega.sh+ <<descripcion detallada del error>>
Ademas, debe finalizar con un exit status 64

--La variable de entorno MINIENTREGA_CONF debe estar definida antes de ejecutar el script.
Dicha variable debe contener el nombre de un directorio en el que existen varios ficheros
de configuracion de practicas. En caso de que la variable no represente un directorio legible
se informarŽa al usuario con exit status 64 (Nota: vuestro script no debe definir dicha
variable). Ademas, se mandarŽa un mensaje de error (ver ejemplo).
Por ejemplo, si ./mal no es un directorio legible y se ejecutan las dos instrucciones siguientes, debe salir por la salida de error:
$ declare -x MINIENTREGA_CONF=./mal
$ minientrega.sh unargumento
minientrega.sh: Error, no se pudo realizar la entrega
minientrega.sh+ no es accesible el directorio "./mal"

--Si MINIENTREGA_CONF representa un directorio accesible, entonces cada nombre de fichero
(que sea accesible) de este directorio (y solo ellos) es un identificador vŽalido de prŽactica. Si
el identificador de la prŽactica (ID_PRACTICA) no es vŽalido se informarŽa al usuario con un
exit status 66. AdemŽas, debe salir por la salida de error:
$ declare -x MINIENTREGA_CONF=./bien
$ minientrega.sh novale
minientrega.sh: Error, no se pudo realizar la entrega
minientrega.sh+ no es accesible el fichero "novale"

--Cada fichero en ${MINIENTREGA_CONF}/* define las siguientes variables en formato
compatible con Bash:


----MINIENTREGA_FICHEROS: contiene la lista de ficheros que deben ser entregados y
que deben estar en el directorio de trabajo desde el que se ejecuta el script. En caso
de que alguno de los ficheros no exista o no sea legible se informara al usuario con un
exit status 66. Ademas, debe salir por la salida de error:
minientrega.sh: Error, no se pudo realizar la entrega
minientrega.sh+ no es accesible el fichero "malfichero"
donde malfichero es el primer fichero de lista de ficheros que deben ser entregados que
bien no existe o no es accesible.

----MINIENTREGA_DESTINO: directorio de destino en el que se debe crear un subdirectorio de entrega para la prŽactica identificada por el identificador de practica
ID_PRACTICA. El nombre del directorio a crear serŽa el nombre del usuario que ejecuta el script (${USER}). En caso de que el directorio de destino no exista o el directorio
de entrega no pueda crearse se informarŽa al usuario con un exit status 73.AdemŽas,
debe salir por la salida de error:
minientrega.sh: Error, no se pudo realizar la entrega
minientrega.sh+ no se pudo crear el subdirectorio de entrega en "maldirectorio"
suponiendo que maldirectorio es el directorio destino.



Este es el cogido que llevo hasta ahora, pero no me funciona bien:

Código:
#/bin/bash


#se comprueba el numero de argumentos
if [ $# -ne "1" ]; then
echo "$0: Error (EX_USAGE), uso incorrecto del mandato. \"Succes\"" >&2
echo "$0+ El numero de argumentos recibidos no es el esperado" >&2
exit 64;
fi


# se comprueba si quiere ayuda
if [ $1 == '-h' -o $1 == '--help' ]; then
echo "$0: --help para la ayuda"
echo "$0+ Copia archivos  de un directorio a otro"
exit 0;
fi


# se comprueba la existencia de  MINIENTREGA_CONF
if test -z ${MINIENTREGA_CONF}; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ No es accesible el directorio ">&2
exit 64;
fi


# se comprueba que MINIENTREGA_CONF es un directorio
if test ! -d ${MINIENTREGA_CONF}; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ No es un directorio  ">&2
exit 64;
fi


#se comprueba que la variable MINIENTREGA_CONF se puede leer lectura

if test ! -r ${MINIENTREGA_CONF}; then
echo "$0: Error, no se pudo realizar la entrega" >&2
echo "$0+ no se puede leer el directorio ">&2
exit 64;
fi


#se comprueba que se puede escribir en el directorio
if test ! -w ${MINIENTREGA_CONF}; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ no se puede escribir en el directorio ">&2
exit 64;
fi


#se comprueba que se puede leer el argumento
if test ! -r ${MINIENTREGA_CONF}/$1; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ no se puede acceder al fichero $1 ">&2
exit 66;
fi
source ${MINIENTREGA_CONF}/$1


#se comprueba que la fecha estea en el formato correcto
if [ ${#MINIENTREGA_FECHALIMITE} -ne 10 ]; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ La fecha es incorrecta ${MINIENREGA_FECHALIMITE}">&2
exit 64;
fi
if ! [[ ${MINIENTREGA_FECHALIMITE:4:1} == '-' && ${MINIENTREGA_FECHALIMITE:7:1} == '-' ]]; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ La fecha es incorrecta ${MINIENTREGA_FECHALIMITE}">&2
exit 0;
fi
if [ ${MINIENTREGA_FECHALIMITE:0:4} -gt 10 ]; then
echo " $0: Error, no se pudo realizar la entrega">&2
echo "$0+ La entrega esta fuera de plazo">&2
exit 0;

fi
if [ ${MINIENTREGA_FECHALIMITE:0:4} -gt 10 -a ${MINIENTREGA_FECHALIMITE:5:2}-ne 01 ]; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ La entrega esta fuera de plazo">&2
exit 66;
fi
if [ ${MINIENTREGA_FECHALIMITE:0:4} -gt 10-a ${MINIENTREGA_FECHALIMITE:7:2}-ne 01 ]; then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ La entrega esta fuera de plazo">&2
exit 73;
fi


#se comprueban los archivos
for fichero in ${MINIENTREGA_FICHEROS[0]}; do
if !(test -r $fichero) || !(test -e $fichero); then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ No es accesible el fichero $fichero">&2
exit 66;
fi
done


#Existe el directorio de destino
if test ! -d ${MINIENTREGA_DESTINO} || test ! -w ${MINIENTREGA_DESTINO};then
echo "$0: Error, no se pudo realizar la entrega">&2
echo "$0+ No se pudo crear el subdirectorio de entrega en ${MINIENTREGA_DESTINO}">&2
exit 73;
fi


#copia los archivos
cp ${MINIENTREGA_FICHEROS}/* ${MINIENTREGA_DESTINO}/${USER}
exit 0;