【问题标题】:How to use expr within an if condition如何在 if 条件下使用 expr
【发布时间】:2014-01-09 07:54:02
【问题描述】:

我有以下if条件:

STATUSFILE = "foo.status"
NEWTIME=1389253927
if [ -f $STATUSFILE ] && [ expr $NEW_TIME - cat $STATUSFILE -gt 3600 ]; then
    echo "foo"
fi;

我得到 [: 参数太多

【问题讨论】:

    标签: linux bash shell command-line


    【解决方案1】:

    if 的参数是一个 unix 命令。 [ 等价于 testif 的结果取决于该命令的返回状态。

    因此,如果你想测试一个命令的返回状态,你应该删除[

    当你想检查一个命令的输出(而不是它的状态)时,你必须保留[并将命令放入$()

    你的陈述应该改写为:

    if [ -f $STATUSFILE ] && [ $(expr $NEWTIME - $(cat $STATUSFILE)) -gt 3600 ]; then
    

    比这更好的是使用$(())提供的bash的算术能力:

    if [ -f $STATUSFILE ] && [ $(($NEWTIME - $(cat $STATUSFILE) )) -gt 3600 ]; then
    

    【讨论】:

    • +1,但通常最好多用双引号,否则任何错误都有可能无法找出和追踪。
    • @ruakh:关于双引号,我不想混淆 OP,并尝试遵循其编码风格。顺便说一句,感谢您的支持和修复。
    • 感谢您的解决方案!它运行良好正是我想要的。
    • bash,可以使用[[ -f $STATUSFILE ]] && (( NEWTIME - $(<$STATUSFILE) > 3600 ));您的版本符合 POSIX。
    【解决方案2】:

    您使用foo $(expr 1 + 1) 将命令expr 1 + 1 的输出用作命令foo 的参数。命令foo expr 1 + 1 简单地运行foo,并使用四个文字字符串expr1+1 作为其参数(我无法想象一种理智、明确的方式让它意味着其他任何东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多