Nenhuma dessas opções parece funcionar. O que estou fazendo de errado? ( leapb
, leapc
e iyr
sã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=0
linha, 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 a
and 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 a
or 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 a
estiver vazio/desdefinido enquanto b
tiver 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=1900
e iyr=1979
(isto énão igual) o primeiro teste falha e leap=0
nunca será executado, não importa qual leapc
seja o valor de.
A única maneira de executar leap=0
é isso leapb=iyr
e 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 bash
seu código. Com os valores fornecidos, o código não alcançaria leap=0
desde então $iyr
e $leapb
nã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: