Linux 如何在if条件下使用expr

Linux 如何在if条件下使用expr,linux,bash,shell,command-line,Linux,Bash,Shell,Command Line,我有以下条件: STATUSFILE = "foo.status" NEWTIME=1389253927 if [ -f $STATUSFILE ] && [ expr $NEW_TIME - cat $STATUSFILE -gt 3600 ]; then echo "foo" fi; 我得到[:太多的参数你使用foo$(expr 1+1)使用命令expr 1+1的输出作为命令foo的参数。命令foo expr 1+1只需使用四个文本字符串expr、1、+和1作为其参

我有以下条件:

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

我得到[:太多的参数

你使用
foo$(expr 1+1)
使用命令
expr 1+1
的输出作为命令
foo
的参数。命令
foo expr 1+1
只需使用四个文本字符串
expr
1
+
1
作为其参数运行
foo
(我无法想象它有一种理智、明确的方式来表示其他任何东西)。如果
的参数是unix命令。
[
相当于
测试
如果
的结果取决于该命令的返回状态

因此,如果要测试命令的返回状态,应该删除
[

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

您的声明应改写为:

if [ -f $STATUSFILE ] && [ $(expr $NEWTIME - $(cat $STATUSFILE)) -gt 3600 ]; then
比这更好的是使用bash的算术功能,由
$(
提供:


+1,但通常最好大量使用双引号,否则任何错误都有可能无法发现和追踪。@ruakh:关于双引号,我不想混淆OP并尝试遵循其编码风格。顺便说一句,感谢您的支持和修复。感谢您的解决方案!它工作得很好,这正是我想要的在
bash
中,您可以使用
[[-f$STATUSFILE]]&((NEWTIME-$(3600))
;您的版本与POSIX兼容。
if [ -f $STATUSFILE ] && [ $(($NEWTIME - $(cat $STATUSFILE) )) -gt 3600 ]; then