逻辑

逻辑

这些选项似乎都不起作用。我究竟做错了什么? ( leapbleapciyr是整数值)

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仅当or中的值b是字符串(或空/未设置)时才会抱怨:

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

这意味着您正在测试的实际代码同时使用[不是引用变量扩展(坏主意):

[ $a -eq $b ]

在这种情况下,如果a为空/未设置而b具有某些值(反之亦然),则报告的错误将是:

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

结论:请使用[[测试版本(在bash、ksh、zsh中)。

逻辑

对于您报告的值:

理解如果leapb=1900iyr=1979(即不等于)第一个测试失败,并且leap=0无论 的值leapc是什么,都永远不会执行。

执行的唯一方法leap=0leapb=iyrthenleapc不是等于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

if$leapb是一个空字符串。

使用[[ ... ]]语法,测试会默默地失败。

相关阅读:

相关内容