Linux/Unix Shell Scripting - Variable problemática

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

Variable problemática

Publicado por epicteto (18 intervenciones) el 20/04/2021 10:41:24
Hola

He hecho un pequeño script, que arranca desde cron, para que asigne a una variable determinados valores que posteriormente se analizan. Esto ocurre a determinadas horas del día, concretamente:

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
if [[ $hora -eq 9 && $minutos -eq 00 ]] || [[ $hora -eq 19  && $minutos -eq 00 ]]; then
    indice=0
elif [[ $hora -eq 9 && $minutos -eq 30 ]] || [[ $hora -eq 19 && $minutos -eq 20 ]]; then
      indice=1
elif [[ $hora -eq 10 && $minutos -eq 00 ]] || [[ $hora -eq 19 && $minutos -eq 40 ]]; then
      indice=2
elif [[ $hora -eq 10 && $minutos -eq 30 ]] || [[ $hora -eq 20 && $minutos -eq 00 ]]; then
      indice=3
elif [[ $hora -eq 11 && $minutos -eq 00 ]] || [[ $hora -eq 20 && $minutos -eq 20 ]]; then
      indice=4
elif [[ $hora -eq 11 && $minutos -eq 30 ]] || [[ $hora -eq 20 && $minutos -eq 40 ]]; then
      indice=5
elif [[ $hora -eq 12 && $minutos -eq 00 ]] || [[ $hora -eq 21 && $minutos -eq 00 ]]; then
      indice=6
elif [[ $hora -eq 12 && $minutos -eq 30 ]] || [[ $hora -eq 21 && $minutos -eq 20 ]]; then
      indice=7
elif [[ $hora -eq 13 && $minutos -eq 00 ]] || [[ $hora -eq 21 && $minutos -eq 40 ]]; then
      indice=8
elif [[ $hora -eq 13 && $minutos -eq 30 ]] || [[ $hora -eq 22 && $minutos -eq 00 ]]; then
      indice=9
elif [[ $hora -eq 14 && $minutos -eq 00 ]] || [[ $hora -eq 22 && $minutos -eq 20 ]]; then
      indice=10
elif [[ $hora -eq 14 && $minutos -eq 30 ]] || [[ $hora -eq 22 && $minutos -eq 40 ]]; then
      indice=11
elif [[ $hora -eq 15 && $minutos -eq 00 ]] || [[ $hora -eq 23 && $minutos -eq 00 ]]; then
      indice=12
elif [[ $hora -eq 15 && $minutos -eq 30 ]] || [[ $hora -eq 23 && $minutos -eq 20 ]]; then
      indice=13
elif [[ $hora -eq 16 && $minutos -eq 00 ]] || [[ $hora -eq 23 && $minutos -eq 40 ]]; then
      indice=14
elif [[ $hora -eq 16 && $minutos -eq 30 ]] || [[ $hora -eq 00 && $minutos -eq 00 ]]; then
      indice=15
elif [[ $hora -eq 17 && $minutos -eq 00 ]] || [[ $hora -eq 00 && $minutos -eq 20 ]]; then
      indice=16
elif [[ $hora -eq 17 && $minutos -eq 30 ]] || [[ $hora -eq 00 && $minutos -eq 40 ]]; then
      indice=17
elif [[ $hora -eq 18 && $minutos -eq 00 ]] || [[ $hora -eq 1 && $minutos -eq 00 ]]; then
      indice=18
elif [[ $hora -eq 18 && $minutos -eq 30 ]] || [[ $hora -eq 1 && $minutos -eq 30 ]]; then
      indice=19
fi

Todo funciona bien excepto lo que debería ocurrir a las 9 ó las 9,30 de la mañana. Por algún motivo que se me escapa los dos primeros condicionales que tienen estas horas no actúan. Sin embargo las horas que están en la misma líne, las 19,00 y las 19,20 sí lo hacen sin problemas. La variable $hora toma su valor de:

1
2
hora=`date +%H`
minutos=`date +%M`

He podido comprobar que a esa variable a las 9 se le asigna el valor 09, no 9... pero es indiferente que en el condicional IF ponga 9 ó 09, nada cambia. Lo mismo ocurre a la 1, pero a esa hora todo funciona perfectamente. El resto de las horas tienen 2 dígitos y como digo todo funciona bien.

En definitiva, todo parece apuntar a que hay un problema con asignar a la variable $hora el valor 9. En otras partes del código ocurren cosas a las 8 y funcionan perfectamente

He comprobado que cron inicia el script correctamente a la hora que debe, por lo que el problema está en el propio script.

Me estoy planteando sustituir este bloque de condicionales por un CASE a ver si se soluciona.. pero me fastidia no saber la causa del problema

Saludos
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

Variable problemática

Publicado por Tom (361 intervenciones) el 20/04/2021 11:49:40
El problema es que [[ evalúa "09" como un número expresado en octal. Ya que el dígito 9 no es válido en octal algo estará dando errores por algún sitio.
Prueba simplemente con [ que sí evalúa 09 como 9 (además, _no_ necesitas usar [[ para lo que haces).
1
2
3
4
5
6
7
8
9
10
11
~$ hora=09
~$ echo $hora
09
~$ if [[ $hora -eq 9 ]]
> then
> echo "SI"
> fi
-bash: [[: 09: value too great for base (error token is "09")
~$ if [ $hora -eq 9 ]; then echo "SI"; fi
SI
~$

De todos modos tira de este hilo y de los enlaces, está bastante bien:

https://stackoverflow.com/questions/24777597/value-too-great-for-base-error-token-is-08
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: 25
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Variable problemática

Publicado por epicteto (18 intervenciones) el 20/04/2021 13:00:42
Realmente tengo un problema con los corchetes y los condicionales ...

¿te importa confirmarme que la manera correcta de escribir " si son las 9 horas y 00 minutos, o si son las 19 horas y 00 minutos ....." es esta?

1
if [ $hora -eq 9 ] && [ $minutos -eq 00 ]  ||  [ $hora -eq 19 ]  && [ $minutos -eq 00 ]; then

Parece funcionar. Me gustaría poder aislar cada una de las partes que separa el operador logico ||, pero no consigo ninguna combinación sin error, y te aseguro que he estado buscando en sitios como stackoverflow. Supongo que porque no será necesario ...

Gracias
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: 25
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Variable problemática

Publicado por epicteto (18 intervenciones) el 20/04/2021 15:24:13
Pues ocurre algo extraño ..

LA solución que doy en mi último mensaje no da error, pero no funciona en mi script. No reconoce la variable


LA primera de las dos opciones que me propones da este error:

./prueba.sh: línea 7: error sintáctico cerca del elemento inesperado `$hora'
./prueba.sh: línea 7: `if [ ($hora -eq 9 && $min -eq 0) || ($hora -eq 19 && $min -eq 0) ]; then'

y la segunda:

./prueba.sh: línea 7: error sintáctico cerca del elemento inesperado `]'
./prueba.sh: línea 7: `if [ $min -eq 0 && ($hora -eq 9 || $hora -eq 19)]; then'

Todo esto es lo que me llevó a doblar los corchetes...
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: 25
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Variable problemática

Publicado por epicteto (18 intervenciones) el 20/04/2021 17:04:52
Bueno, finalmente creo que lo tengo:

1
if [[ ($hora -eq 9 && $min -eq 0) || ($hora -eq 19 && $min -eq 0) ]]; then

Parece funcionar bien
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

Variable problemática

Publicado por Tom (361 intervenciones) el 20/04/2021 18:02:32
Tienes razón parece que los paréntesis dentro de test ([) no funcionan ... parece que el manual está desactualizado ??
Pero sí parece que funcionan fuera, usando el operador clásico (-o, -a) y dejando siempre espacio en blanco:
1
2
3
4
5
6
7
8
~$ hora=09
~$ min=0
~$ if [ $min -eq 0 ] && ( [ $hora -eq 9 -o $hora -eq 19 ] ); then echo SI; fi
SI
~$ hora=19
~$ if [ $min -eq 0 ] && ( [ $hora -eq 9 -o $hora -eq 19 ] ); then echo SI; fi
SI
~$
Lo que ocurre es que en este caso el paréntesis no sirve de nada y se puede quitar.

De cualquier manera te convendría simplificar el asunto, creo yo, por ejemplo:
1
2
3
4
5
~$ hora=$(date '+%H%M')
~$ if [ $hora = "0900" -o $hora = "1900" ]; then indice=0;
> elif [ $hora = "0930" -o $hora = "1920" ]; then indice=1;
> fi
~$
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: 25
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Variable problemática

Publicado por epicteto (18 intervenciones) el 22/04/2021 10:04:05
La última opción, además de ser más simple, funciona perfectamente. Tom, gracias por tu ayuda
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