這裏有一個簡單的方法來了解你的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'
讓我們通過這裏的幾件事情:
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'
作爲替代方案,你可以有也用&&
結膜而不是-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' ]]
的任意時間Stringwise比較應該就好了,只要他們工作在'%T'格式前導零添加到個位數小時。 –
它不。如果您嘗試在[$(date +「%T」)-gt「06:00:00」] && [$(date +「%T」) - 「21:00:00」 ];'你得到'./a:第3行:[:00:12:27:預期的整數表達式' – fedorqui
你當然是對的......我受到原代碼的影響,看到'-lt'爲一個字符串比較,它不是。如果你想比較'%T''''',你需要像'[[$(date +%T)> 06:00:00]]'' –