lógica

lógica

Nenhuma dessas opções parece funcionar. O que estou fazendo de errado? ( leapb, leapce iyrsão valores inteiros)

if [[ $leapb -eq $iyr && $leapc -ne $iyr ]]; then
  leap=0
fi

Alternativamente,

if [[ $leapb -eq $iyr ]] && [[ $leapc -ne $iyr ]]; then
  leap=0
fi

Ao executar isso usando iyr=1979, leapb=1900, leapc=1600, o script não atinge a leap=0linha, com mensagem de erro informando -eq: unary operator expected.

Responder1

Com uma versão simplificada do seu código:

[[ $a -eq $b ]]

Não há erro com nenhum valor de aand b, mesmo strings, vazias ou não definidas.

Uma versão mais antiga [[é [, mas mesmo assim, devidamente citada:

[ "$a" -eq "$b" ]

Só reclama quando o valor dentro de aor bé uma string (ou vazio/não definido):

./script: line 13: [: StringInsideA: integer expression expected

O que significa que o código real que você está testando está usando [enãocitando as expansões variáveis ​​(má ideia):

[ $a -eq $b ]

Nesse caso, se aestiver vazio/desdefinido enquanto btiver algum valor (ou vice-versa), o erro relatado será:

./script: line 14: [: -eq: unary operator expected

Conclusão: use a [[versão do teste (enquanto estiver em bash,ksh,zsh).

lógica

Para os valores que você informa:

Entenda que se leapb=1900e iyr=1979(isto énão igual) o primeiro teste falha e leap=0nunca será executado, não importa qual leapcseja o valor de.

A única maneira de executar leap=0é isso leapb=iyre então leapcénãoigual a iyr.

mais simples

Se tudo o que você deseja fazer é detectar quando um ano é bissexto, use isto:

leap=$(( y>0 && ( y%4==0 && y%100>0 || y%400==0 ) ))

Nesta fórmula, o salto será 1 para anos bissextos e 0 caso contrário.

Responder2

Não consigo reproduzir o erro no bashseu código. Com os valores fornecidos, o código não alcançaria leap=0desde então $iyre $leapbnão são iguais.

No entanto, se eu modificar assim:

if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
    leap=0
fi

então isso produziria

[: -eq: unary operator expected

if $leapbé uma string vazia.

Com a [[ ... ]]sintaxe, o teste falharia silenciosamente.

Leitura relacionada:

informação relacionada