我在 Ubuntu 机器上使用 GNU bash,版本 4.3.46。出于某种原因,这个 while 循环无法按预期工作。
菜单应该连续循环,直到用户决定退出程序,然后进行一些错误检查提示用户是否确定,然后程序结束。
代码如下:
#!/bin/bash
menu_choice=0
quit_program="n"
while [[ $menu_choice -ne 3 && $quit_program != "y" ]]
do
printf "1. Backup\n"
printf "2. Display\n"
printf "3. Exit\n\n"
printf "Enter choice: \n"
read menu_choice
if [ $menu_choice -eq 3 ]
then
printf "Are you sure you want to quit? (y/n)\n"
read quit_program
fi
done
我认为它可能必须在开始时声明全局变量,并且我在本地读取一个新值......
答案1
问题出在你的 while 循环条件中。这一行:
while [[ $menu_choice -ne 3 && $quit_program != "y" ]]
意思是“虽然 menu_choice 不是 3和quit_program 不是 y,继续循环。”问题是,如果其中一个条件不再成立,while 循环就会结束。
你想要的是这个:
while [[ $menu_choice -ne 3 || $quit_program != "y" ]]
使用||
而不是&&
。这样,只要有一个条件为真,while 循环就会继续循环,而不是两个条件都为真。
答案2
这个更简单的脚本应该适合你
#!/bin/bash
menu_choice=0
quit_program=false
while [ $quit_program == false ]
do
printf "1. Backup\n"
printf "2. Display\n"
printf "3. Exit\n\n"
printf "Enter choice: \n"
read menu_choice
if [ $menu_choice -eq 3 ]
then
printf "Are you sure you want to quit? (y/n) "
read ask
if [ $ask == "y" ]
then
quit_program=true
fi
fi
done
printf "\nDone\n"
没有必要继续检查menu_choice
,这样可以从 while 循环检查中删除。
在我上面的例子中,我只是设置了一个布尔值,quit_program
在循环中对其进行检查。如果用户选择选项 3,然后对确认说“y”,则布尔值将设置为 true 以终止循环。
您还可以更进一步,而无需检查布尔值:
#!/bin/bash
menu_choice=0
while true
do
printf "1. Backup\n"
printf "2. Display\n"
printf "3. Exit\n\n"
printf "Enter choice: \n"
read menu_choice
if [ $menu_choice -eq 3 ]
then
printf "Are you sure you want to quit? (y/n) "
read ask
if [ $ask == "y" ]; then break; fi
fi
done
printf "\nDone\n"
第二个示例完成了相同的任务,但循环只是运行,而不检查之前的布尔值。而是使用命令while
中断循环。break