2009-12-11 56 views
0

我有代碼匹配:Bash ||在if []中;塊

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

爲什麼?

回答

4

應該

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

[(和!)是shell內置。它們不是if的語法的一部分。

+1

如果您感興趣,[通常是'test'命令的符號鏈接。所以你可以做一個測試的人。 – ssteidl 2009-12-11 20:48:35

1

嘗試重寫你如果作爲

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

'-bash:[:太多參數' – 2009-12-11 20:36:43

0

[是一個實際的內置命令,要求],因爲它是最後一個參數。

不過你的語法,使最後一個參數[3600」,然後啓動一個新的命令..

嘗試使[]一個命令的命令。

+0

'-bash:意外標記附近的語法錯誤'$ LAST_MODIFIED'' – 2009-12-11 20:39:31

+0

對不起... powershell語法...我將用bash語法更新 – 2009-12-11 20:40:43

+0

真的所有其他答案都是好極了,所以我會刪除這個壞榜樣。 – 2009-12-11 20:41:50

0

請記住,在bash [內置命令必須履行外部/bin/[命令的語法要求(通常是一個鏈接/bin/test),以維持與SH的過時的版本,其中test[)沒有內部至外殼的向後兼容性。

爲了兌現兼容性解析器必須把該級別||作爲隔板,以一個新的命令,從而終止[命令。當/bin/test被稱爲[(它在argv [0]上檢查它),那麼它需要關閉「]」作爲參數。

使用-o(或)在您的測試([)命令。

(我個人認爲這是一個壞主意,卻使用了[形式的test正是這種原因。新手會認爲它是一個語法功能......一種條件表達式構建到if聲明,期待其語義與其作爲命令的執行不一致。所以我教它test,即使我使用它(有時)爲[,因爲這種做法如此廣泛。