2012-01-09 10 views
4

我寫了一個bash腳本,僅在工作時間執行卷曲調用。出於某種原因,每小時比較失敗時,我添加一個「-a」運算符(由於某種原因,我的bash不能識別「& &」)。多個-a大於/小於打破bash腳本

雖然腳本大得多,這裏是有關部分:

HOUR=`date +%k` 

if [ $HOUR > 7 -a $HOUR < 17 ]; 
then 
    //do sync 
fi 

的劇本給我的錯誤:

./tracksync: (last line): Cannot open (line number): No such file 

然而,這種比較沒有失敗:

if [ $DAY != "SUNDAY" -a $HOUR > 7 ]; 
then 
    //do sync 
fi 

我的語法錯了,或者這是我的bash問題嗎?

回答

13

您不能在bash腳本中使用<>。使用-lt-gt爲:

if [ $HOUR -gt 7 -a $HOUR -lt 17 ] 

<>使用的shell執行標準輸入和標準輸出重定向。

你說的比較工作實際上是在當前目錄中創建一個名爲7的文件。

至於&&,這對shell還有一個特殊的含義,用於創建命令的「AND列表」。

所有這些最好的文檔:man bash(和man test有關比較運算符的詳細信息)

+0

很酷,不知道。感謝您的提示=) – 2012-01-09 16:11:49

+0

不客氣;) – 2012-01-09 16:24:45

+5

其實,您可以在'[]'中使用'<' and '>',但您需要轉義或引用它們以防止它們被解釋爲重定向,並且它們按字母順序排列比較而不是數字比較。例如,'[7 \> 17]'是真實的,因爲「7」在(「大於」)「17」之後按字母順序排列。 – 2012-01-09 16:27:38

0

我建議你用身邊的變量引用引號和「標準」運營商:

if [ "$HOUR" -gt 7 -a "$HOUR" -lt 17 ]; ...; fi 
+0

如果我知道不會有空格或特殊字符,是否有任何理由這樣做? – 2012-01-09 16:16:28

+1

健壯性(不能保證* date *命令會按照您的預期行事),並使其成爲一種習慣。 – 2012-01-09 16:51:52

+0

在bash中更好的是使用[[改爲。 – jordanm 2012-01-09 18:42:55

0

嘗試使用[[代替,因爲它更安全並具有更多功能。數字比較也使用-gt-lt

if [[ $HOUR -gt 7 && $HOUR -lt 17 ]] 
then 
    # do something 
fi 
+0

(lastline):[[:未找到 – 2012-01-09 16:15:20

+2

@Calvin Froedge:這意味着你的腳本沒有在bash中運行;如果你想使用''[['',你需要用'#!/ bin/bash'而不是'#!/ bin/sh'來啓動bash擴展] – 2012-01-09 16:23:33

+0

啊。很酷,謝謝=) – 2012-01-09 17:06:55

6

這裏有幾個答案,但沒有一個建議實際的數值上下文。

這裏是如何做到這一點在bash:

if ((hour > 7 && hour < 17)); then 
    ... 
fi 

注意,不需要「$」,擴大在數字方面的變量。

+0

這絕對是要走的路。使用通用數學符號進行比較的圖像。 – raider33 2016-12-14 13:22:18