lógica

lógica

Ninguna de estas opciones parece funcionar. ¿Qué estoy haciendo mal? ( leapb, leapcy iyrson 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=1600el script no llega a la leap=0lí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 ay 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 ao bes 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 aestá vacío/no configurado mientras btiene 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=1900y iyr=1979(es decirno es igual) la primera prueba falla y leap=0nunca se ejecutará sin importar cuál leapcsea el valor de.

La única forma de llegar a ejecutar leap=0es esa leapb=iyry luego leapcesnoigual 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 bashdado su código. Con los valores dados, el código no alcanzaría leap=0desde $iyry $leapbno 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 $leapbes una cadena vacía.

Sin embargo, con la [[ ... ]]sintaxis, la prueba fallaría silenciosamente.

Lectura relacionada:

información relacionada