我正在使用 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
答案 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_func
或quit
)。
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”来正确退出循环。