Ninguna de estas opciones parece funcionar. ¿Qué estoy haciendo mal? ( leapb
, leapc
y iyr
son valores enteros)
if [[ $leapb -eq $iyr && $leapc -ne $iyr ]]; then
leap=0
fi
Alternativamente,
if [[ $leapb -eq $iyr ]] && [[ $leapc -ne $iyr ]]; then
leap=0
fi
Cuando se ejecuta esto usando iyr=1979
, leapb=1900
, leapc=1600
el script no llega a la leap=0
línea y aparece un mensaje de error que indica -eq: unary operator expected
.
Respuesta1
Con una versión simplificada de su código:
[[ $a -eq $b ]]
No hay ningún error con ningún valor de a
y b
, ni siquiera cadenas, vacías o sin configurar.
[[
Hay una versión anterior de [
, pero incluso eso, debidamente citado:
[ "$a" -eq "$b" ]
Solo se queja cuando el valor dentro de a
o b
es una cadena (o está vacía/no configurada):
./script: line 13: [: StringInsideA: integer expression expected
Lo que significa que el código real que estás probando utiliza [
ynocitando las expansiones de variables (mala idea):
[ $a -eq $b ]
En cuyo caso, si a
está vacío/no configurado mientras b
tiene algún valor (o viceversa), el error reportado será:
./script: line 14: [: -eq: unary operator expected
Conclusión: utilice la [[
versión de la prueba (mientras esté en bash,ksh,zsh).
lógica
Para los valores que usted reporta:
Entiende que si leapb=1900
y iyr=1979
(es decirno es igual) la primera prueba falla y leap=0
nunca se ejecutará sin importar cuál leapc
sea el valor de.
La única forma de llegar a ejecutar leap=0
es esa leapb=iyr
y luego leapc
esnoigual a iyr
.
más simple
Si todo lo que quieres hacer es detectar cuando un año es bisiesto, usa esto:
leap=$(( y>0 && ( y%4==0 && y%100>0 || y%400==0 ) ))
En esta fórmula, el salto será 1 para los años bisiestos y 0 en caso contrario.
Respuesta2
No puedo reproducir el error bash
dado su código. Con los valores dados, el código no alcanzaría leap=0
desde $iyr
y $leapb
no son iguales.
Sin embargo, si lo modifico así:
if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
leap=0
fi
entonces esto produciría
[: -eq: unary operator expected
si $leapb
es una cadena vacía.
Sin embargo, con la [[ ... ]]
sintaxis, la prueba fallaría silenciosamente.
Lectura relacionada: