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