【发布时间】: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
我有以下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
if 的参数是一个 unix 命令。 [ 等价于 test。 if 的结果取决于该命令的返回状态。
因此,如果你想测试一个命令的返回状态,你应该删除[。
当你想检查一个命令的输出(而不是它的状态)时,你必须保留[并将命令放入$(和)。
你的陈述应该改写为:
if [ -f $STATUSFILE ] && [ $(expr $NEWTIME - $(cat $STATUSFILE)) -gt 3600 ]; then
比这更好的是使用$((和))提供的bash的算术能力:
if [ -f $STATUSFILE ] && [ $(($NEWTIME - $(cat $STATUSFILE) )) -gt 3600 ]; then
【讨论】:
bash,可以使用[[ -f $STATUSFILE ]] && (( NEWTIME - $(<$STATUSFILE) > 3600 ));您的版本符合 POSIX。
您使用foo $(expr 1 + 1) 将命令expr 1 + 1 的输出用作命令foo 的参数。命令foo expr 1 + 1 简单地运行foo,并使用四个文字字符串expr、1、+ 和1 作为其参数(我无法想象一种理智、明确的方式让它意味着其他任何东西)。
【讨论】: