Bash重复调用一个函数

时间:2016-01-17 20:22:22

标签: bash input while-loop user-input repeat

我正在使用 bash版本3.2.57(1) -release(x86_64-apple-darwin14)

在用户决定退出之前,如何重复调用函数?

如果我将函数放在while循环内部的顶部,则会调用该函数,但它会重复执行。

    call_func () {
            echo "Im inside call_func"
            echo "some text: " >> file.txt

    }

    while true
    do
            echo "1) call_func "
            echo "q) to quit"
            echo "\n"
            echo "Enter your selection \c"
            read answer

            case "$asnwer" in
                    q|Q) exit;;
            call_func 
    esac
    done

2 个答案:

答案 0 :(得分:0)

我之前的回答涵盖了如何修复现有代码,在这里我将建议一种更好的方法(假设您专门使用bash):

select answer in call_func quit; do
    case $answer in
        (call_func) call_func;;
        (quit) break;;
        ("") echo "Unknown option. Press return again to see available options.";;
    esac
done

使用上述脚本的示例会话:

1) call_func
2) quit
> 1
Im inside call_func
> 6
Unknown option. Press return again to see available options.
> 
1) call_func
2) quit
> 2

bash中的select关键字会自动为您设置编号菜单,并循环接收输入。它还会将用户提供的数字转换为为该数字提供的文本(在这种情况下为call_funcquit)。

select记录在bash手册页中,但基本上它由三部分组成:

select VARIABLENAME in LIST OF ITEMS
do
    CODE
done

VARIABLENAME是用户做出选择时要设置的变量时,LIST OF ITEMS是要显示的选项列表,CODE是用户进行选择时要执行的代码一个选择。 select构造是一个循环,因此它会一直执行到break

答案 1 :(得分:-1)

  

如果我将函数放在while循环内部的顶部,则会调用该函数,但它会重复执行。

是的。你这样做了,函数确实应该在case语句之上(之外)。你的问题是:

    call_func
    case "asnwer" in
        q|Q) exit;;
    esac

这个 是正确的,但你在case块中使用字符串asnwer。你打算使用变量:

    call_func
    case $answer in
        q|Q) exit;;
    esac

进行此更改后,您应该可以通过键入“q”来正确退出循环。