for循环行为不一致

时间:2013-11-15 08:48:54

标签: bash shell

我正在编写一个应该启动分布式erlang应用程序的几个节点的脚本(尽管在同一台机器上)。这是代码的精简示例:

start_extra_node() {
    echo "starting node $1"
    port=$((14195+$1))
    mystartcommand -p $port -n node$1 --daemonize
    res=$?
    if [ $res -ne 0 ]; then 
        echo "ERROR: could not start extra VM node $1"
        exit
    fi
    return $res
}

make_run() {
    echo " "
    echo "----------------------------------------------"
    echo "making run with $3 nodes"
    start=$2
    end=$(($3-1))
    echo "$start $end"
    for i in $(seq -s " " $start $end); do
        echo "start node $i"
        start_extra_node $i
    done
}

case $# in
    0)
        usage;;
    1)
        echo "starting node that runs the function st:$1 ..."
        start_api_node $1;;
    2)
        echo "running evaluation on 1 to $2 nodes"
        for i in `seq -s " " 1 $2`; do
            echo "make_run $1 1 $i"
            make_run $1 1 $i
        done
        ;;
    esac

使用2个参数调用脚本:第一个参数在此处不重要。第二个参数是最大节点数。该脚本应该在1到2个节点上运行一个函数。

假设我使用bash myscript foo 3启动脚本:

根据mystartcommand -p $port -n node$1 --deamonizestart_extra_node的存在,make_run中的for循环表现不同。 如果我将其留在port=$((14195+$1))失败,因为$ 1评估为1 2。如果我注释掉mystart...,则算术表达式不会失败,因为$ 1会按预期评估为1然后2

以下是mystartcommand...的示例输出:

>bash myscript foo 3
...[snip]
making run with 3 nodes
1 2
start node 1 2
starting node 1 2
eval_mr.sh: Zeile 17: 14195+1 2: Syntaxerror in expression.

mystart...被注释掉的地方:

>bash myscript foo 3
...[snip]
making run with 3 nodes
1 2
start node 1
starting node 1
start node 2
starting node 2

我不知道如何进一步调试这个。我会感谢任何领导。

编辑 deamonize to daemonize

1 个答案:

答案 0 :(得分:2)

很难想象这真的来自遗漏mystartcommand。它必须与$IFS内容有关。

您可以尝试替换

for i in $(seq -s " " $start $end); do

for ((i=$start; i<=$end; $i++)); do

为了有一个真正的循环。