shell脚本:间接递归不能按预期工作(重复次数太多)

时间:2014-08-13 11:55:30

标签: bash function shell recursion

我正在使用Pashua处理对话框的BASH shell脚本。现在我遇到了一个结构问题:我的主要功能是从一个获取用户输入的对话框开始。然后它调用一个函数来测试这个输入。如果结果令人满意,则没有任何事情发生,主要继如果不是,则测试函数返回错误并再次调用main,以便用户可以正确执行此操作。 这导致在调用测试函数之后主要部分运行两次(或甚至更多)。这是不可取的,但可以理解。

示例:

main () {
    ...do some dialog stuff...
    test_function
    ...do some more interesting stuff...
}

test_function () {
    if [ ...something doesnt fit... ]
    then
        echo "lets try this again!"
        main
    fi
}

main

那么,我怎样才能阻止脚本执行 ...更有趣的东西... 多一次呢?就像突破主力并再次开始主力?

谢谢!

4 个答案:

答案 0 :(得分:2)

放弃递归 它不属于这种情况。

main () {
    while ! read_input; do
        echo "lets try this again!"
    done
    ...do some more interesting stuff...
}

read_input () {
    ...do some dialog stuff...
    [[ ...something doesnt fit... ]] && return 1 || return 0
}


main

答案 1 :(得分:0)

在对话框代码上使用循环,并在需要时不跳过第一次迭代:

main () {
    local first=1
    while [[ $first ]] || test_function ; do
        dialog_stuff
        unset first
    done
}

test_function () {
    if [ ... ] ; then
        return 1
    fi
    return
}

答案 2 :(得分:0)

main () {
    while do_some_dialog_stuff; do
        test_function && break
    done
    ...do some more interesting stuff...
}

do_some_dialog_stuff() {
  ...do some dialog stuff...
  return 0
}

test_function () {
    if [ ...something doesnt fit... ]
    then
        echo "lets try this again!"  >&2
        return 1
    fi
}

main

答案 3 :(得分:0)

我将输入内容和测试内容放在一起,这样您就可以使用一个函数返回整体状态。这是有道理的,因为你总是想在输入之后运行测试内容。

然后,您可以在单个函数上运行循环。在等待某些事情是正确的时候,我发现untilwhile !更具可读性。

main (){
    until test_function; do
        continue
    done
}

test_function () {
    ... do some dialogue stuff ...
    if [ ...something doesnt fit... ]
    then
        echo "lets try this again!"  >&2
        return 1
    fi
}