这些选项似乎都不起作用。我究竟做错了什么? ( 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
仅当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=1900
和iyr=1979
(即不等于)第一个测试失败,并且leap=0
无论 的值leapc
是什么,都永远不会执行。
执行的唯一方法leap=0
是leapb=iyr
thenleapc
是不是等于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
是一个空字符串。
使用[[ ... ]]
语法,测试会默默地失败。
相关阅读: