Linux/Unix Shell Scripting - Estoy aprendiendo a utilizar unix shell

 
Vista:
sin imagen de perfil

Estoy aprendiendo a utilizar unix shell

Publicado por Alfonso (1 intervención) el 07/01/2020 15:33:46
Hola , me encuentro haciendo mi primer programa en Unix shell y estoy un poco bloqueado.
Debo hacer lo siguiente
Las ideas principales son:
El script a desarrollar entender´a que cada pr´actica tiene un identificador de pr´actica.
El script utilizar´a el identificador de pr´actica para conocer la informaci´on relacionada con
dicha pr´actica: ficheros a entregar y directorio de entrega. Informaci´on que habr´a que
extraer de un fichero con el mismo nombre que el identificador de pr´actica.
La labor principal del script ser´a copiar los ficheros apropiados de un directorio (del supuesto usuario del script) a otro directorio (directorio de entrega).
El script deber´a ser ejecutado mediante el siguiente mandato:
minientrega.sh ID_PRACTICA
o bien, en una configuraci´on m´as habitual
./minientrega.sh ID_PRACTICA
ID_PRACTICA es una ristra de caracteres que representa el hipot´etico nombre de una pr´actica
(por ejemplo prac1, prac7, bucles, etc.).
El script comprobar´a que el identificador de pr´actica (ID_PRACTICA) es v´alido, comprobar´a
que existen los ficheros exigidos para la pr´actica identificada por ese identificador de pr´actica
y finalmente copiar´a todos los ficheros a un directorio adecuado. El script devolver´a 0 como
c´odigo de error para indicar que todo funcion´o correctamente o un c´odigo de error distinto de 0
indicando qu´e error se produjo. El script no esperar´a ninguna informaci´on a trav´es de la entrada
est´andar ni provocar´a la emisi´on 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. M´as detalles:
Si el script ha sido invocado sin argumentos o con m´as de uno se informar´a 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+ <<descripci´on detallada del error>>
Adem´as, 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 configuraci´on de pr´acticas. 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). Adem´as, 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 informar´a al usuario con un
exit status 66. Adem´as, 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 pr´actica
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 codigo que tengo hasta ahora:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#/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;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder