логика

логика

Ни один из этих вариантов не работает. Что я делаю не так? ( leapb, leapcи iyr— целые значения)

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

В качестве альтернативы,

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

При запуске этого с помощью iyr=1979, leapb=1900, leapc=1600, скрипт не достигает строки leap=0, выдавая сообщение об ошибке -eq: unary operator expected.

решение1

Упрощенная версия вашего кода:

[[ $a -eq $b ]]

Ошибок не возникает ни при каком значении aи b, даже если это строки, пустые или неустановленные значения.

Более старая версия [[[, но даже она, правильно процитирована:

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

Вызывает ошибку только в том случае, если значение внутри aили bявляется строкой (или пустым/неустановленным):

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

Это означает, что фактический код, который вы тестируете, использует [инетцитирование расширений переменных (плохая идея):

[ $a -eq $b ]

В этом случае, если aпусто/не установлено, но bимеет какое-либо значение (или наоборот), будет выведена следующая ошибка:

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

Вывод: пожалуйста, используйте [[версию теста (находясь в bash,ksh,zsh).

логика

Для сообщаемых вами значений:

Поймите, что если leapb=1900и iyr=1979(то естьне равный) первый тест не пройден, и он leap=0никогда не будет выполнен, независимо от значения leapc.

Единственный способ добиться исполнения leap=0— это то, что leapb=iyrи leapcтогданетравно iyr.

проще

Если все, что вам нужно, это определить, является ли год високосным, используйте это:

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

В этой формуле високосный год будет равен 1, в противном случае — 0.

решение2

Я не могу воспроизвести ошибку в bashданном коде. С данными значениями код не достигнет, leap=0так как $iyrи $leapbне равны.

Однако, если я изменю его следующим образом:

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

то это произведет

[: -eq: unary operator expected

если $leapbэто пустая строка.

Однако с таким [[ ... ]]синтаксисом тест молча провалится.

Сопутствующее чтение:

Связанный контент