2014-09-24 107 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