2017-04-16 20 views
0

嗨,夥計們我試圖在我的bash腳本中執行一項檢查,它需要滿足三個條件,我能夠在if語句中使前兩個條件工作,因爲我想,但是當我想用運算符實現一些算術運算的第三次檢查時,腳本甚至不會啓動。如何在Bash的if語句中使用算術

DOUBLE_CHECK=0 

if [[ -z "$avail" && "$WIFI_ID" == "some_str" && 'expr $DOUBLE_CHECK % 2' -eq "0"]]; then 
     sudo caffeinate xterm -geometry 70x20+0+0 -fa monospace -fs 8 -e './script1.sh' & disown 

fi 
(($DOUBLE_CHECK++)) 

的想法是我想要的第三次檢查,有一個數字,增量隨着時間的推移我while循環內,然後檢查,當它被2整除它傳遞的if語句

回答

1

作爲一個單獨的應答指出,可以使用反引號或優選$()擴大表達到內命令的輸出,這樣的:

if [[ -z "$avail" && $WIFI_ID == "some_str" && $(expr $DOUBLE_CHECK % 2) -eq "0" ]] 

請注意我已經加入一個(必需)空間在最後的]]之前。

另一種可能性是使用算術表達式:

if [[ -z $avail && $WIFI_ID == "some_str" ]] && ((DOUBLE_CHECK % 2 == 0)) 

請注意我已刪除無害的,但不必要的行情:雙括號內的條件表達式是不是一個正常的命令,這是特殊的shell語法,它不執行分詞。我留下了some_str左右的引號,因爲如果不引用引號,則等式/不等式比較將在右側表達式上執行模式匹配。算術表達式中的變量名之前也沒有$:它可以工作,但在(())$(())內部不需要。

表達也可以被表示爲:

if [[ -z $avail && $WIFI_ID == "some_str" ]] && ! ((DOUBLE_CHECK % 2)) 

這樣做的原因是,(())具有0返回代碼,如果它的數值結果爲非零,否則非零返回代碼。

0

第3條件有幾個小問題

  1. 您的第三個條件應該使用back-ticks('`')而不是引號進行評估。 bash中的單引號表示字符串文字。所以,'expr $DOUBLE_CHECK %2' -eq "0"總是是假的

  2. 檢查-eq是用來比較數字。你的語句使用字符串(比較字符串,使用正常==語法)

請嘗試,

DOUBLE_CHECK=0 

if [[ -z "$avail" ]] && [[ "$WIFI_ID" == "some_str" ]] && [[ `expr $DOUBLE_CHECK % 2` -eq 0 ]]; then 
     sudo caffeinate xterm -geometry 70x20+0+0 -fa monospace -fs 8 -e './script1.sh' & disown 

fi 
(($DOUBLE_CHECK++)) 
+1

我不認爲你的#3建議是有效的。 Bash條件支持邏輯運算符,我不知道有什麼理由避免它們(與標準'''測試中的'-a'和'-o'相反]。 – Fred

+0

'[[「A」==「A」]] && [[「B」==「B」]] && echo'foo''適合我 –

+0

是的,它的工作原理。我並不是說你提出的替代語法是錯誤的,我的觀點是,我不認爲推薦將邏輯運算符置於條件之外是個好建議。如果是(可能),這對我來說是新鮮事物。 – Fred

0

可以使用[[ .. ]]字符串邏輯(其中===是等同的)和((...))用於數字比較,並廢除expr

if [[ -z "$avail" && "$WIFI_ID" = "some_str" ]] && ((DOUBLE_CHECK % 2 == 0)); then 
    # your logic here 
fi 

請注意,pr使用$的固定變量在((...))內部是可選的,並且在[[ ... ]]內引用變量是可選的,因爲不會在那裏進行分詞和匹配。