【问题标题】:Bash invoke a function repeatedlyBash 重复调用一个函数
【发布时间】:2016-04-22 22:39:03
【问题描述】:

我正在使用 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

【问题讨论】:

  • 应该是case "$answer" in
  • 推荐阅读:help break.
  • 是的,我已经修改了

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


【解决方案1】:

我之前的回答涵盖了如何修复您现有的代码,在这里我将推荐一种更好的方法(鉴于您专门使用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

【讨论】:

  • 该函数只在第一次被调用,当函数完成并且用户再次选择该函数时,它不会被再次调用。我的实际功能是调用另一个功能。这和它有关系吗?
  • 如果您多次调用该函数时遇到问题,是否可以显示该函数的代码(编辑问题)?我认为问题可能出在函数内部。
【解决方案2】:

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

是的。您做得对,该函数确实应该在case 语句的上方(外部)。你的问题是这样的:

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

是正确的,但是您在 case 块中使用了字符串 asnwer。你的意思是使用变量:

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

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

【讨论】:

  • 有人能解释为什么这个答案被否决了吗?我相信它以问题作者所期望的方式解决了问题提出的问题。如果不是这样,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多