Linux/Unix Shell Scripting - Shell Scripting

 
Vista:
sin imagen de perfil
Val: 14
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Shell Scripting

Publicado por carlos (9 intervenciones) el 28/09/2018 20:26:38
Buenas. Estoy en un curso de informatica y en el curso de sistemas operativos me pidieron a mi a mi grupo un trabajo final.
Debemos realizar uno o varios shell script para administrar un salon de uso comunitario.
La dificultad que se nos presenta viene de este fragmento de lo que se nos pide:
En un archivo se debe guardar la fecha y hora de reserva del salón.


Captura

No sabemos como realizar lo que nos piden en esa parte.
Agradecemos ayuda. Gracias.
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
Imágen de perfil de xve
Val: 104
Oro
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Shell Scripting

Publicado por xve (309 intervenciones) el 29/09/2018 08:52:00
Hola Carlos, esto que comentas, es una especie de agenda, no?

Exactamente que problema teneis? que lenguaje estáis utilizando?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Shell Scripting

Publicado por carlos (9 intervenciones) el 29/09/2018 11:42:01
Algo así sería. No se que lenguajes hay. Lo que te puedo decir es que es un ahell script que usa como interprete de comando el BASH.
El cliente va ingresando sus datos personales y la fecha y hora de reserva. No puede superar laa 6 horas de duracion
Toda esa indormacion ingresada debemoa guardarla en un archivo "txt", el cual ya tiene 20 usuarios ingresados a mano por nosotros. El problema es que para corroborar que la fecha y hora que ingresó el cliente no este usada ya. Pensamos en usar el comando grep en un IF.
Ejemplo:
Reas fecha
Read hora--> este dato nos complica ya que debe ser hora y minuto.
Read duracion
If [ grep $fecha Reservas.txt ]
Esa es la logica que tenemos, pero obviamente esa ultima linea no funciona.
Hay algun comando para "traer" informacion del archivo al shell script?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de abZer0x
Val: 101
Oro
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Shell Scripting

Publicado por abZer0x (27 intervenciones) el 30/09/2018 06:26:29
Hola Carlos, podrías contarnos un poco más, Por ejemplo cual es el formato con el cual se guardan los datos en el archivo.
Además creo que faltan un dato de entrada que es la hora de fin de la reserva, ya que sin esta no se podría calcular la duración de la misma, a menos que se solicite la directamente la duración en horas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Shell Scripting

Publicado por carlos (9 intervenciones) el 30/09/2018 13:31:11
El formatl sería:

Nombre : Apellido : cedula : telefono : fecha : horainicio : duracion
Todo una linea y debajo de cada uno de esos items los datos de cada persona. Sería un formato tabla.

Lo que me comentas de el dato que falta es lo que nos cuesta. La parte de la hora es en la que no sabesmos que hacer. Suponemos que es horainicio y duracion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de abZer0x
Val: 101
Oro
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Shell Scripting

Publicado por abZer0x (27 intervenciones) el 01/10/2018 08:46:23
Hola Carlos, no estoy seguro de si es así el ejercicio, pero te comparto una posible solución o al menos una idea de la misma. El código esta comentado, pero igual si tienes alguna duda puedes comentarla aquí en el foro.

reservas.txt Archivo de ejemplo
1
2
3
4
5
abzer0x|abzer0x|12345678|12345678|2018-10-01|10:30|12:30
abzer0x|abzer0x|12345678|12345678|2018-10-01|15:00|18:00
abzer0x|abzer0x|12345678|12345678|2018-10-04|18:00|22:00
abzer0x|abzer0x|12345678|12345678|2018-10-04|22:00|23:59
abzer0x|abzer0x|12345678|12345678|2018-10-05|10:00|13:00

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
112
113
114
115
116
117
#!/bin/bash
 
# Cambiar el valor de estas varibles dependiendo de la necesidad
# del programa
TIEMPO_MINIMO_RESERVA=1
TIEMPO_MAXIMO_RESERVA=6
HORA_INICIO_RESERVA='08:00' # AM
HORA_FIN_RESERVA='02:00' # AM
FILE='reservas.txt' # Archivo para almacenar los datos de las reservas
 
# Expresiones regulares utilizadas para las validaciones de fecha y hora
REGX_FECHA="^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
REGX_HORA="^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])$"
 
function hora_a_segundos() {
	local hora=$(echo "$1"|cut -d: -f1|bc)
	local minutos=$(echo "$1"|cut -d: -f2|bc)
	hora=$((hora*3600))
	minutos=$((minutos*60))
	local segundos=$((hora+minutos))
	echo $segundos
}
################################################################
# NOTA
# Aquí deberian pedirse también los datos personales
################################################################
while [[ true ]]; do
 read -p "Ingrese la fecha: [AAAA-MM-DD]: " fecha
	if [[ "$fecha" =~ $REGX_FECHA ]] && date -d "$fecha" >/dev/null ; then
		break
	else
		echo "La fecha ingresada no es valida"
	fi
done
while [ true ]; do
 read -p "Ingrese la hora de inicio: [HH:MM]: " hora_inicio
	if [[ "$hora_inicio" =~ $REGX_HORA ]]; then
		break
	else
		echo "La fecha ingresada no es valida"
	fi
done
while [ true ]; do
 read -p "Ingrese la hora de fin: [HH:MM]: " hora_fin
	if [[ "$hora_fin" =~ $REGX_HORA ]]; then
		break
	else
		echo "La hora no es valida"
	fi
done
 
segundos_hora_inicio=$(hora_a_segundos $hora_inicio)
segundos_hora_fin=$(hora_a_segundos $hora_fin)
 
# Compruebo que la hora de inicio se encuentre dentro de la franja permitida
if [[ $segundos_hora_inicio -ge 7200 && $segundos_hora_inicio -lt 28800 ]]; then
	echo "La hora inicio debe estar entre las 08:00 AM y 01:00 AM"
elif [[ $segundos_hora_inicio > $segundos_hora_fin ]];
then
	echo "La hora de inicio debe ser menor a la hora de fin"
else
	# Chequeo que la duración sea >= 1 y <= que 6
	duracion=$(((segundos_hora_fin - segundos_hora_inicio)/3600))
	if [[ $duracion -lt $TIEMPO_MINIMO_RESERVA || $duracion -gt $TIEMPO_MAXIMO_RESERVA ]]; then
			echo "La reserva debe ser entre $TIEMPO_MINIMO_RESERVA y $TIEMPO_MAXIMO_RESERVA horas."
	else
		# Busco si hay reservas en la fecha ingresada
		disponible=true
		$(grep $fecha $FILE > tmp.txt)
		if [[ $? -eq 0 ]]; then
			# Hay reservas para la fecha, por lo tanto evaluo horarios disponibles
			for line in $(cat tmp.txt)
			do
				fecha_reserva=$(echo $line | cut -d'|' -f5)
				hora_inicio_reserva=$(echo $line | cut -d'|' -f6)
				hora_fin_reserva=$(echo $line | cut -d'|' -f7)
				# Convierto segundos
				hora_inicio_reserva=$(hora_a_segundos $hora_inicio_reserva)
				# Como esta es la hora de fin le sumo la hora de limpieza requerida entre un evento y otro
				# 3600 segundos -> 1 hora
				hora_fin_reserva=$(($(hora_a_segundos $hora_fin_reserva) + 3600))
 
				# Esta es la parte clave:
				# Existen 3 opciones
				# 1) Que la hora de inicio ingresada por el usuario, sea mayor o igual que la hora de inicio y a su vez
				#    menor que la hora de fin, es decir que este entre la hora de inicio/fin de una reserva
				#    Ejemplo: 15:30 - 16:30 y el usuario ingrese como hora de inicio 16:00 
				# 2) Igual que el anterior pero con la hora de fin
				# 3) Por ultimo, es que la hora de inicio ingresada sea menor que la hora de una reserva y que la hora de 
				#    fin sea mayor que la hora de fin de la misma reserva:
				#    Ejemplo: 10:00 - 12:00 y el usuario ingresa 09:00 - 13:00 es decir, la hora de reserva abarca otro horario
				#    previamente ocupado.
 
				if [[ ($segundos_hora_inicio -ge $hora_inicio_reserva && $segundos_hora_inicio -lt $hora_fin_reserva) ||
				($segundos_hora_fin -ge $hora_inicio_reserva && $segundos_hora_fin -lt $hora_fin_reserva) ||
				($segundos_hora_inicio -le $hora_inicio_reserva && $segundos_hora_fin -lt $hora_fin_reserva) ]]
				then
					echo "Ya heciste una reserva en este horario"
			    disponible=false
					break;
				fi
			done
			# Elimino el archivo temporal
			rm -f "tmp.txt"
		fi
		if [[ $disponible  = true ]]
		then
			echo "Reserva realizada con éxito"
			################################################################
			# NOTA:
			# Debes cambiar esta linea con los datos personales ingresados por el usuario.
			# El separador de campos utilizados entre cada datos es el pipe |
			################################################################
			echo -e "abzer0x|abzer0x|12345678|12345678|$fecha|$hora_inicio|$hora_fin\n" >> $FILE;
		fi
	fi
fi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar