为什么这个菜单不循环?

为什么这个菜单不循环?

我在 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 不是 3quit_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

相关内容