Да, они называются "правилами окна", и большинство популярных оконных менеджеров (Compiz, Kwin, Xfwm и т.д.) реализуют их в той или иной форме.
Compiz требует установки неофициального пакета "compiz plugins", KWin включает их в стандартную установку, а Xfwm устанавливает их в конфигурационном файле.
Я не могу воспроизвести ошибку в bash
с учетом вашего кода. С заданными значениями код не достиг бы leap=0
, так как $iyr
и $leapb
не равны.
Однако, если я изменю его следующим образом:
if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
leap=0
fi
, тогда это даст
[: -eq: unary operator expected
, если $leapb
— пустая строка.
Однако с синтаксисом [[... ]]
тест завершится без ошибок.
Похожие материалы:
С упрощенной версией вашего кода:
[[ $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 в противном случае.