我正在使用bash版本3.2.57(1)-release (x86_64-apple-darwin14 14)
在用户决定退出之前,我如何反复调用函数?
如果我将函数放在顶部,在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发布于 2016-01-17 20:48:16
我以前的回答介绍了如何修复现有代码,这里我将推荐一种更好的方法(考虑到您具体使用的是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
> 2bash中的select关键字将自动为您设置一个编号菜单,并循环接收输入。它还将将用户提供的数字转换为为该数字提供的文本(本例中为call_func或quit )。
select记录在bash手册页中,但本质上它由三个部分组成:
select VARIABLENAME in LIST OF ITEMS
do
CODE
done其中,VARIABLENAME是用户选择时要设置的变量,LIST OF ITEMS是要显示的选项列表,CODE是用户做出选择时要执行的代码。select构造是一个循环,因此它将一直执行到break。
发布于 2016-01-17 20:36:57
如果我将函数放在顶部,在while循环中,则会调用该函数,但它将重复执行。
是啊。如果这样做是正确的,函数实际上应该在(外部) case语句之上。你的问题是:
call_func
case "asnwer" in
q|Q) exit;;
esac这是正确的,但是在case块中使用的是字符串asnwer。您的意思是使用变量:
call_func
case $answer in
q|Q) exit;;
esac完成此更改后,您应该能够通过键入"q“退出循环。
https://stackoverflow.com/questions/34843203
复制相似问题