脚本没有退出错误bash ios

时间:2014-09-24 15:22:33

标签: ios bash error-handling

所以我不得不自己做错误处理并遇到问题,下面的代码导致问题。

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

每当ping 成功或失败时,我都会抛出错误处理程序,一旦我关闭sbalertsbalert -t "Checking" -m "Checking for updates please wait" -d ""会在屏幕上重新显示它应该被杀死。

我已经尝试重新排序错误处理的三个部分来尝试修复此问题。但无济于事......

我有点像菜鸟,很抱歉,如果答案正在打击我......

2 个答案:

答案 0 :(得分:1)

在bash中,连接器||&&只是从左到右执行。 ||没有更高的优先级。

试试看它的工作原理:

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

所以当你这样做时:(简化)

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

kill仅在ping失败时执行,但如果sbalertping成功,则kill会执行,exit如果sbalert已执行并成功,则执行。

因此,如果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

答案 1 :(得分:1)

如果ping ,则第二个sbalert会触发。

Shell &&||不是三元运算符。

当shell看到a || b && c时,如果您希望它为(a || b) && c,则会将其解释为a || (b && c)

明确地对命令进行分组(例如a || { b && c; })或使用明确的if