2013-06-04 78 views
4

我想寫一個bash腳本,如果時間是在一定的時間之後和某個時間之前,將會循環。這是我得到的,但它給了我一個錯誤;兩次之間的Bash while循環

#!/bin/bash 

while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00']; 
    do 
    ##echo `php mainstatquery.php` 
    echo "Hello World"; 
    sleep 5; 
done 

,這是錯誤

./timer.sh: line 3: [: missing `]' 

如果任何人都可以在正確的方向指向我。

回答

4

這裏有一個簡單的方法來了解你的while問題:

[是一個實際的Unix命令。做ls /bin/[,你會看到。它是鏈接到/bin/test命令。從命令行執行man test並查看可以完成的各種測試

while所做的是執行您提供的命令,如果它返回零退出狀態,則while語句被視爲true,並且該語句將繼續。你可以做這樣的事情:

while sleep 2 
do 
    echo "I slept for two seconds" 
done 

所有test命令確實是做一些測試(文件測試,平等的測試等),並返回一個零,如果聲明是真實的,非零否則:

$ test 2 -gt 3 
$ echo $? 
1 <- That statement is false 

$ [ 2 -lt 3 ] #The test command using square brackets 
$ echo $? 
0 <- That statement is true. 

看看聯機幫助頁test,你會看到所有有效測試。這:

while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'] 

相同

while test date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00' 

讓我們通過這裏的幾件事情:

  • 日期+%T不是爲test命令的有效運營。

test命令不能在內部執行命令。你需要做的是把這個命令放在$(..),並且可能使用引號來安全起見。因此:

while test "$(date +"%T")" -gt '06:00:00' && "$(date +"%T")" -lt '21:00:00' 
  • &&不在test命令的有效操作。你可能想要的是-a這是聯合起來將test中的兩個測試串起來。

這將使你:

while test $(date +"%T") -gt '06:00:00' -a "$(date +"%T")" -lt '21:00:00' 
  • 有兩個獨立的大於測試運營商比較。一個是字符串,一個是整數。 -gt是對整數的測試。由於您在處理字符串,因此您需要使用>>

    while test「$(date +」%T「)」> '06:00:00'-a「$(date +」%T「 )」 < '21:00:00'

作爲替代方案,你可以有也用&&結膜而不是-a,但&&的每一面必須是獨立的測試語句:

while test "$(date +"%T")" > '06:00:00' && test "$(date +"%T")" < '21:00:00' 

現在,讓我們轉換test語法bac k到[...],因爲它是對眼睛

while [ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ] 

OR

while [ "$(date +"%T")" > '06:00:00' ] && [ "$(date +"%T")" < '21:00:00' ] 

順便說比較容易,內部[[...]]比較好 - 尤其與>跡象,因爲它可以通過外殼的解釋文件重定向。

while [[ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ]] 

OR

while [[ "$(date +"%T")" > '06:00:00' ]] && [[ "$(date +"%T")" < '21:00:00' ]] 
0

關閉[命令的]必須是單獨的參數。在它之前放一個空格。

3

你不能比較這樣的整個小時。

當你只是檢查小時(6 < = X < = 21),使用date "+%H"做到這一點:

while [ $(date +"%H") -gt 06 ] && [ $(date +"%H") -lt 21 ]; 
    do 
    ##echo `php mainstatquery.php` 
    echo "Hello World"; 
    sleep 5; 
done 

也考慮到了date表達必須與$()被要求存入它會得到結果。而你的

while [ date +"%T" -gt '06:00:00' &&  date +"%T" -lt '21:00:00']; 
     $(  )    ] && [ $(  )   ^need space 

最後,邏輯條件寫得不好。最好的POSIX recommended的方法是:

if [ -f $VAR1 ] && [ -f $VAR2 ] && [ -f $VAR3 ] 
+0

的任意時間Stringwise比較應該就好了,只要他們工作在'%T'格式前導零添加到個位數小時。 –

+1

它不。如果您嘗試在[$(date +「%T」)-gt「06:00:00」] && [$(date +「%T」) - 「21:00:00」 ];'你得到'./a:第3行:[:00:12:27:預期的整數表達式' – fedorqui

+1

你當然是對的......我受到原代碼的影響,看到'-lt'爲一個字符串比較,它不是。如果你想比較'%T''''',你需要像'[[$(date +%T)> 06:00:00]]'' –

1

它看起來像你只關心小時,以便:

#!/bin/bash 

while [ $(date +"%k") -gt 6 -a $(date +"%k") -lt 21 ]; 
do 
    ##echo `php mainstatquery.php` 
    echo "Hello World"; 
    sleep 5; 
done