Bash || if [];块

时间:2009-12-11 20:24:01

标签: bash file

我有代码匹配:

if [ $LAST_MODIFIED -lt 3600 || ! -f "$i" ]; then
    wget $WGET_OPTS $BASE$i
    LAST_MODIFIED=`echo "\`date +%s\` - \`stat -c %Y $i\`" | bc`
    if [ $LAST_MODIFIED -lt 500 ]; then
        $FILES_MODIFIED++
    fi
fi

$i是通过

定义的
for i in `/bin/grep ".gz" index.html | awk -F\" '{print $2}'`

然而,bash告诉我

[: missing `]'

-f: command not found

为什么?

5 个答案:

答案 0 :(得分:9)

您应该使用[[ ... ]]代替[ ... ]或使用-o代替||

if [[ $LAST_MODIFIED -lt 3600 || ! -f "$i" ]]; then

或:

if [ $LAST_MODIFIED -lt 3600 -o ! -f "$i" ]; then

见这里:http://www.ibm.com/developerworks/library/l-bash-test.html

答案 1 :(得分:4)

应该是

if [ $LAST_MODIFIED -lt 3600 ] || ! [ -f "$i" ]; then

[(和!)是shell内置函数。它们不是if

语法的一部分

答案 2 :(得分:1)

尝试将if重写为

if [ cond a ] || [ cond b ]; then
...
fi

答案 3 :(得分:0)

[是一个实际的内置命令,需要]作为它的最后一个参数。

但是你的语法使[3600”的最后一个参数成为一个新的命令..

尝试在[]之间执行命令。

答案 4 :(得分:0)

请记住,bash [内置命令必须遵守外部/bin/[命令的语法要求(通常是/bin/test的链接)才能保持向后兼容性sh的古老版本,其中test[)不是shell的内部。

为了尊重这种兼容性,解析器必须对待||作为新命令的分隔符,从而终止[命令。当/bin/test被称为[(它在argv [0]上检查它)时,它需要关闭“]”作为参数。

在测试([)命令中使用-o(或)。

(就我个人而言,我认为使用[形式的test就是一个坏主意。正是出于这个原因。新手将其视为一种语法特征......一种条件表达式构造到if语句,期望语义与其作为命令的实现不一致。所以我把它教导为test,即使我使用它(有时)作为[,因为这种做法是如此普遍