Necestio ayuda con un programa de Unix shell

Iniciado por Alfonsoo01, 7 Enero 2020, 16:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Alfonsoo01

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:

#/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;