2012-12-16 184 views
3

if語句似乎沒有正常運行,不管if語句的結果如何,程序啓動。我錯過了什麼?如果語句失敗bash

#!/bin/bash 

dtime=($(date |cut -c12-13)) 
sevenO="19" 
redshift=($(gtk-redshift -l -31.9530044:115.8574693)) 

if ([[ "$dtime" -gt "$sevenO" ]]) 
then 
    $redshift 
fi 
+0

當你運行這個你檢查的dtime和seven0的價值? if語句看起來很好,所以我猜你的價值觀並不是你所期待的。 – regulatethis

+4

你一直使用括號。我不認爲這意味着你的想法。 – kojiro

+1

爲了進行調試,您應該使用'set -x'作爲bash腳本的第二行。它會詳細輸出您的腳本實際執行的操作。你可以用'set + x'關掉它。 – Perleone

回答

6

難道我理解正確的話,你只需要運行gtk-redshift如果時間是8點到午夜之間?如果是這樣,問題是,這個符號:

$(...) 

運行命令...立即,並評估其輸出;因此該語句:

redshift=($(gtk-redshift -l -31.9530044:115.8574693)) 

運行命令gtk-redshift -l -31.9530044:115.8574693,然後將變量redshift是包含命令的輸出的陣列。 (一個數組,因爲包圍了(...)注意,在Bash中,括號是而不是僅僅用於分組,它們有實際的行爲—,例如,在這種情況下,創建一個數組—,你不應該在你不希望這些行爲)

您可以簡化您的bash腳本只是這一點:

#!/bin/bash 

if [[ "$(date +%k)" -ge 20 ]] ; then 
    gtk-redshift -l -31.9530044:115.8574693 
fi 
+2

請注意,如果小時數爲08或09,這會讓您陷入麻煩 - 您會得到八進制錯誤。使用'date +%k'或強制base-10加上'if((10#$(date +%H)> = 20))' –

+1

@glennjackman:哎呀,謝謝。我使用了'+%H'因爲我打算繞過數值比較並使用'>',但是後來我決定使用'20'而不是'19',並且字符串比較不允許'> = ',所以我切換回數字比較,並忘記切換到'+%k'。長話短說 。 。 。我現在要修復它。謝謝。 :-) – ruakh