2014-09-24 123 views
0

所以我不得不做我自己的錯誤處理,並遇到問題,下面的代碼導致問題。腳本不會退出錯誤bash ios

sbalert -t "Checking" -m "Checking for updates please wait" -d "" & 
alert_id="$!" 
ping -c 1 repod00r.com || kill $alert_id && sbalert -t "Connection error" -m "Unable to connect to the update server." && exit 

每當平成功或失敗我得到拋出的錯誤處理程序,一旦我關閉屏幕上的sbalertsbalert -t "Checking" -m "Checking for updates please wait" -d ""再次出現時,它應該被殺死。

我已經嘗試重新排序錯誤處理的三個部分來嘗試修復此問題。但無濟於事......

我有點小白,很抱歉,如果答案是衝我的臉......

回答

1

在bash,連接器||&&只是執行留下來對。 ||沒有更高的優先級。當你這樣做

true || echo 1 && echo 2 
false || echo 1 && echo 2 
false || false && echo 1 && echo 2 

試試這個,看看它是如何工作(簡體)

ping || kill $alert_id && sbalert && exit 

如果ping失敗,kill僅執行,但sbalert如果任一執行pingkill成功,如果sbalert執行成功,則執行exit

所以如果ping成功,第二個sbalert將執行,但原來的sbalert不會被殺死,這似乎是你正在經歷的。

您的代碼會更容易閱讀和if語句寫:

sbalert -t "Checking" -m "Checking for updates please wait" -d "" & 
alert_id=$! 
if ! ping -c 1 repod00r.com; then 
    kill $alert_id 
    sbalert -t "Connection error" -m "Unable to connect to the update server." 
    exit 
fi 
+0

我還沒有測試(引導我的電腦),但它看起來很有希望。謝謝。 – iTechy 2014-09-24 16:51:55

+0

應該'如果ping -c 1 repod00r.com [「$?」 -ne「0」];那麼'工作?作爲任何不退出零的東西。 – iTechy 2014-09-24 19:29:57

+1

@ itechy21:不,這是無效的。 '['是*命令*,不是'if'語法的一部分。 'if'的語法是'if command-list;然後再命令列表;別的命令列表; fi',測試是否'command-list'中的最後一個命令是否以成功(0)狀態碼退出。 – rici 2014-09-24 19:41:58

1

如果任平擊殺成功是第二sbalert將觸發。

殼牌&&||不是三元運營商。

當shell看到a || b && c時,它會將其解釋爲(a || b) && c,當您期待它爲a || (b && c)時。

明確地將您的命令分組(例如a || { b && c; })或使用明確的if