if变量比较的语句在bash shell中不起作用

时间:2014-12-03 14:09:21

标签: bash shell comparison

我试图编写一个非常简单的脚本来检查iptables是否已经更新,以便Synergy正常工作。目前的脚本是:

if [[ $SYNERGY = "yes" ]]
then
    echo "Synergy is active"
else
    sudo iptables -I INPUT -p tcp --dport 24800 -j ACCEPT
    export SYNERGY=yes
fi

但它不起作用(每次打开新终端时,我总是要求输入sudo密码)
我也试过这个修改过的版本,但结果是一样的

syn="yes"
if [ "$SYNERGY" = "$syn" ]
then
    echo "Synergy is active"
else
    sudo iptables -I INPUT -p tcp --dport 24800 -j ACCEPT
    export SYNERGY=yes
fi

问题出在哪里?

2 个答案:

答案 0 :(得分:3)

如果您希望从一个终端/ shell会话运行并影响其他无关的终端/ shell会话,则问题在于export的工作原理并非如此。

export在当前进程的环境中设置变量,以便从此进程生成的任何进程也在其环境中拥有它。注意我是怎么说的“催生”的?它仅适用于处理生成的进程。不相关的流程不受影响。

如果你想要一个全局可检查的东西,你需要一个某种类型的标志/锁/状态文件或iptables配置的实际运行时检查。

答案 1 :(得分:0)

只是为了帮助那些有同样问题的人,这就是我设法保留防火墙设置的方法:

sudo apt-get install iptables-presistent

然后在/ etc / iptables中的rules.v4或rules.v6文件中指定的规则在启动时自动加载