Ни один из этих вариантов не работает. Что я делаю не так? ( 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
это пустая строка.
Однако с таким [[ ... ]]
синтаксисом тест молча провалится.
Сопутствующее чтение: