error sintáctico: operador aritmético inválido [BASH]

Iniciado por Javilondo, 4 Mayo 2013, 02:17 AM

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

Javilondo

Hola amigos estoy haciendo un circuito para un reloj mecánico controlado por un Raspberry Pi con Debian.
Hay un script llamado encoders.sh que lee la posición de las manecillas del reloj a través de unos encoders conectados al GPIO, luego la escribe en dos archivos: "/var/www/vars/hora_caratula/hora" y "/var/www/vars/hora_caratula/minuto" respectivamente.
Hasta ahí todo va bien, pero estoy atorado con un segundo script llamado sincro.sh, lo que se supone que tiene que hacer es interpretar los valores de los archivos antes mencionados y compararlos con la hora del sistema, de manera que se pueda calcular si la carátula del reloj tiene algún retraso o adelanto, para posteriormente sincronizar las manecillas con la hora del sistema.

El valor de los archivos es hora=5 y minuto=0, así quedaron después de la última lectura de los encoders.

Este es el código:

#! /bin/bash
# sincro.sh

# Carga valores de hora en carátula
cHor=$(cat /var/www/vars/hora_caratula/hora)
cMin=$(cat /var/www/vars/hora_caratula/minuto)
# Carga valores de hora del sistema
sHor=$(date +%I)
sMin=$(date +%M)
# Filtra cadenas
sHor=${sHor/#0/} # Extrae el primer cero, si lo hubiese, ej: 08 --> 8
sMin=${sMin/#0/} # Extrae el primer cero, si lo hubiese, ej: 08 --> 8
sHor=${sHor/12/0} # Sustituye el 12 por 0.

# Calcula minutos transcurridos en carátula
minCar=$[$cHor * 60 + $cMin ]
# Calcula minutos trasncurridos en sistema
minSis=$[$sHor * 60 + $sMin ]
# Calcula la diferencia de minutos transcurridos
minDif=$[$minCar - $minSis ]

# Muestra la Horade la carátula y la hora del sistema:
echo "Hora Carátula: $cHor:$cMin | Minutos: $minCar"
echo "Hora Sistema: $sHor:$sMin | Minutos: $minSis"

# Muestra la diferencia de minutos entre ambas horas.
# Si la diferencia es negativa se aplica valor absoluto:
if [[ minDif -lt 0 ]]
then echo "Diferencia: Atrasado con $[$minDif * -1] minutos"
else echo "Diferencia: Adelantado con $minDif minutos"
fi

El problema es que cuando ejecuto el script me arroja este error:
root@raspberrypi:~# ./sincro.sh
")60 + 0sintáctico: operador aritmético inválido (el elemento de error es "
| Minutos: a: 5
Hora Sistema: 5:53 | Minutos: 353
Diferencia: Atrasado con 353 minutos


Lo extraño es que cuando introduzco valores artificiales como asignación de las dos primeras variables en vez de asignar el valor de los archivos entonces el script se ejecuta correctamente y sin errores.
Aquí está el segmento que modifiqué:

#! /bin/bash
# sincro.sh

#cHor=$(cat /var/www/vars/hora_caratula/hora)
cHor=5
#cMin=$(cat /var/www/vars/hora_caratula/minuto)
cMin=0
...

Y su respectiva salida:

root@raspberrypi:~# ./sincro.sh
Hora Carátula: 5:0 | Minutos: 300
Hora Sistema: 6:9 | Minutos: 369
Diferencia: Atrasado con 69 minutos


No comprendo porqué el error emerge cuando cargo los valores desde los archivos, así que para descartar un error de lectura elaboré otro script llamado ajuste.sh con el siguiente código:

#! /bin/bash
# ajuste.sh

./sincro.sh $(cat /var/www/vars/hora_caratula/hora) $(cat /var/www/vars/hora_caratula/minuto)

Como verán ahora estoy leyendo los mismos archivos desde el script ajuste.sh e inyectándolos como parámetros al script sincro.sh, para esto tuve que retocar un poco el código de sincro.sh para que pueda recibir dichos parámetros, quedó así:
#! /bin/bash
# sincro.sh

# Carga valores de hora en carátula
#cHor=$(cat /var/www/vars/hora_caratula/hora)
cHor=$1
#cMin=$(cat /var/www/vars/hora_caratula/minuto)
cMin=$2
...

Y la salida que me dió es:
root@raspberrypi:~# ./ajuste.sh
")60 + 0sintáctico: operador aritmético inválido (el elemento de error es "
| Minutos: a: 5
Hora Sistema: 6:25 | Minutos: 385
Diferencia: Atrasado con 385 minutos

Otra vez con los errores de sintaxis aun pasando los valores como parámetros, pero se me ocurrió modificar un poco el script de ajuste.sh de manera que enviase valores artificiales en ves de leer los archivos, lo mismo que hice anteriormente en el script sincro.sh solo que ahora sería a través de parámetros desde el script ajuste.sh
La modificación fue comentar las asignaciones de los archivos y sustituirlos con valores artificiales '5' y '0'. He aquí el código:
#! /bin/bash
# ajuste.sh

./sincro.sh 5 0 #$(cat /var/www/vars/hora_caratula/hora) $(cat /var/www/vars/hora_caratula/minuto)

Y su respectiva salida:
root@raspberrypi:~# ./ajuste.sh
Hora Carátula: 5:0 | Minutos: 300
Hora Sistema: 6:34 | Minutos: 394
Diferencia: Atrasado con 94 minutos

La salida no tiene errores como cuando introduje los valores artificiales en el script original (sin parámetros).
Como pueden ver, aparece un patrón, este es que cuando asigno los valores desde los archivos ya sea desde el script original através de parámetros aparece el "error de sintaxis" y cuando asigno valores artificiales ya sea en el script original como atraves de parámetros, la salida está libre de errores.

Notarán que para los valores de asignación usé siempre los mismos valores que contenían los archivos desde la última lectura de los encoders ('5' y '0'), esto lo hice para evitar un sesgo, o sea que el código trate siempre con los mismos valores y solo cambie la situación del flujo de código de la "hora de la carátula". También se podrán dar cuenta que los valores de la "hora del sistema" han ido cambiando en cada ejecución, esto es natural, puesto que estos valores realmente son extraídos de la hora del sistema que está en avance constante, pero a pesar de eso nunca presentó anomalías, quiere decir que el problema está en la sección de asignación de valores de la "hora de la carátula" y sólo cuando dicha asignación era procedente de la lectura de los archivos.
Dudo que sea un problema de lectura porque estoy como root, además sistema de ficheros no está corrupto.
Cuando las pruebas fueron efectuadas los permisos de dichos archivos estaban en 755, posteriormente los cambié a 777 y repetí las pruebas pero todo sigue igual.
Para descartar definitivamente errores de lectura escribí otro script llamado valores.sh que simplemente muestra el contenido de los archivos:
#! /bin/bash
# valores.sh

echo "Hora: $(cat /var/www/vars/hora_caratula/hora)"
echo "Minuto: $(cat /var/www/vars/hora_caratula/minuto)"

Dando la siguiente salida:
root@raspberrypi:~# ./valores.sh
Hora: 5
Minuto: 0

El script pudo leer y mostrar sin problemas el contenido de los archivos, así que me consta que no hay error de lectura.
Tal vez el problema no es tan grande, tal vez sea un error obvio de novato que está justo frente a mi, pero no logro verlo.

Si alguien encuentra el dichoso error de sintaxis agradecería que lo compartiera, es posible que yo no sea el único que pase por esto.
Saludos
He dicho.