【发布时间】:2014-11-24 11:11:29
【问题描述】:
我问了一个类似的问题here(您可能想检查一下)但没有收到答案,所以我将尝试简化它。
#/bin/sh
. /etc/ssh/autossh.conf
if [[ $(ifconfig pdp_ip0 |grep inet) && ! $(ifconfig en0 |grep inet) ]];
then
export NETTEST1=1; echo true
else
export NETTEST1=0; echo false
fi
if [[ ! $(ifconfig pdp_ip0 |grep inet) && $(ifconfig en0 |grep inet) ]];
then
export NETTEST2=1; echo true
else
export NETTEST2=0; echo false
fi
while
test $NETTEST1 -eq 1;
do
echo true
done
while
test $NETTEST2 -eq 1;
do
echo true
done
这段代码的问题是它会在条件为真时继续执行命令。我需要它对每个真语句只执行一次,然后等到该语句为假然后再次为真。我一直在努力解决它,我想知道它是否可能。任何帮助总是受到赞赏。
我应该这样做吗:
while true; do
while ifconfig pdp_ip0 |grep inet && ! ifconfig en0 |grep inet;
do sleep 1; done
while ! ifconfig pdp_ip0 |grep inet && ifconfig en0 |grep inet; do sleep 1; done
killall autossh; start-autossh
done;
【问题讨论】:
-
ifconfig命令在if语句中执行一次(并且仅执行一次)。然后脚本将退出(如果 NETTEST1 和 NETTEST2 都为零)或永远循环(如果 NETTEST1 或 NETTEST2 为 1)。 -
可以,但需要不断检查接口的状况。 echo true 在 while 循环 id put killall 和我正在执行的另一个脚本上。如果我这样做,它将继续不必要地杀死我的脚本。
-
与问题无关(我不太明白):
if [[ ! $(ifconfig pdp_ip0 |grep inet) && $(ifconfig en0 |grep inet) ]];不必要地复杂(尽管它会起作用)。你可以更简单地写:if ! ifconfig pdp_ip0 | grep -q inet && ifconfig en0 | grep -q inet; then ... -
这确实是一个我正在尝试解决的复杂问题。当其中一个接口关闭然后重新启动它时,我需要检查脚本来杀死二进制文件。问题是它需要每个 true 完成一次。这就是为什么我需要等待返回 false 才能再次执行 true 。这与我的网络接口关闭和 autossh 不知道如何切换到活动接口有关。
-
@Geofferey:iOS 有
/etc/network/if-up.d和/etc/network/if-down.d脚本吗?那将是最简单的解决方案。
标签: bash shell loops networking conditional-statements