每次我的while循环计数器重置?

时间:2014-08-08 20:25:05

标签: bash unix

如果在5次检查后找不到关联的屏幕,我正在写一个脚本来重启一个过程:

f=0
while true; do(
    for s in server1 server2 server3; do(
            if ! screen -ls|grep -q "$s"; then(
                    f=$(($f + 1))
                    #Here, f is always 1 more than the value
                    #I set at the beginning of the script
                    echo "$s missed $f heartbeats"
            )else(
                    f=0
            )fi

            if [ "$f" -ge 5 ]; then(
                    echo "`date`: $s down, starting"
                    /path/to/start/script
            )fi
    )done
sleep 1
#f is 0 here
)done
在while循环的每次迭代之后,

f被设置回初始值,即使我没有在循环中设置f。我怎样才能使我的反击持续存在?

1 个答案:

答案 0 :(得分:4)

用于封闭每个循环的主体和if语句的不必要的括号形成子shell,并且对子shell中的变量所做的任何更改都是该shell的本地变量,并在子shell退出时消失。

f=0
while true; do
    for s in server1 server2 server3; do
        if ! screen -ls|grep -q "$s"; then
            f=$(($f + 1))
            echo "$s missed $f heartbeats"
        else
            f=0
        fi
        if [ "$f" -ge 5 ]; then
            echo "`date`: $s down, starting"
            /path/to/start/script
        fi
    done
    sleep 1
done

来自bash手册页的SHELL GRAMMAR部分(强调我的):

  

(list)列表在子shell环境中执行(请参阅下面的COMMAND EXECUTION ENVIRONMENT)。 影响shell环境的变量赋值和内置命令在命令后不会保持有效                 完成。返回状态是列表的退出状态。