【问题标题】:Creating sub menu in bash在 bash 中创建子菜单
【发布时间】:2014-08-03 00:46:07
【问题描述】:

我正在尝试执行以下操作:

function main_menu 
{
option=0
until [ "$option" = "4" ]; do
echo "  1.) Add user"
echo "  2.) Remove user"
echo "  3.) Update user"
echo "  4.) Quit"

echo -n "Enter choice: "
read option
echo ""
case $option in
    1 ) add_user ; press_enter ;;
    2 ) remove_user ; press_enter ;;
    3 ) update_user ; press_enter ;;
    4 ) exit;;
    * ) tput setf 4;echo "Please enter 1, 2, 3, or 4";tput setf 4; 
esac
done
 }

在switch case中(do while option is not 4)。第三个选项将显示另一个带有switch case的子菜单,如下所示:

function update_user 
{
 option=0
 until [ "$option" = "3"]; do
 echo "  1.) Update username"
 echo "  2.) Update password"
 echo "  3.) Return to menu"

 echo -n "Enter choice: "
 read option
 echo ""
 case $option in
 1 ) update_username; press_enter ;;
 2 ) update_password; press_enter ;;
 3 ) main_menu; press_enter ;;
 4 ) exit;;
 * ) tput setf 3;echo "Please enter 1, 2 or 3";tput setf 3; 
 esac
 done
  }

第三个选项回到主菜单,但是当我尝试退出时,子菜单不断出现。

谁能给我更好的建议?

【问题讨论】:

  • 一些代码可能有用
  • @KonstantinV.Salikhov 更新代码
  • 你可以使用 bash select builtin tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_06.html
  • @KonstantinV.Salikhov 我会试试看。不过还有其他方法吗?
  • 首先清理您的代码以使其完全运行,然后发布。正如所写,您的子菜单永远不会被调用。

标签: bash shell submenu


【解决方案1】:

正如@KonstantinV.Salikhov 所指出的,bash 中的菜单是select 循环的用途。

这是使用select 实现菜单的一种方法:

main_menu () {
    options=(
        "Add user"
        "Remove user"
        "Update user"
        "Quit"
    )
    select option in "${options[@]}"; do
        case $option in
            ${options[0]})
                add_user
                break
            ;;
            ${options[1]})
                remove_user
                break
            ;;
            ${options[2]})
                update_user
                break
             ;;
            ${options[3]})
                exit
             ;;
            *) 
                echo invalid option
            ;;
        esac
    done
}
main_menu

【讨论】:

    【解决方案2】:

    $option替换两次$selection,用exit替换break,在函数update_user中删除},在函数update_user之后添加}并替换"$option" = "7"4 "$option" = "4"


    #!/bin/bash 函数更新用户 { 选项=0 直到 [ "$option" = "3"];做 echo " 1.) 更新用户名" echo " 2.) 更新密码" echo " 3.) 返回菜单" echo -n "输入选项:" 阅读选项 回声“” 案例$选项在 1)更新用户名;按_输入;; 2)更新密码;按_输入;; 3)主菜单;按_输入;; 4)休息;; * ) tput setf 3;echo "请输入 1、2 或 3";tput setf 3; 经社理事会 # } 完毕 } 功能主菜单 { 选项=0 直到 [ "$option" = "4" ];做 echo "1.) 添加用户" echo " 2.) 删除用户" echo " 3.) 更新用户" 回声“ 4.)退出” echo -n "输入选项:" 阅读选项 回声“” 案例$选项在 1)添加用户;按_输入;; 2) 删除用户;按_输入;; 3) 更新用户;按_输入;; 4)退出;; * ) tput setf 4;echo "请输入 1、2、3 或 4";tput setf 4; 经社理事会 完毕 } 主菜单

    【讨论】:

    • 代码运行,但是如果我用exit替换break,它不会退出程序吗?我正在尝试返回子菜单。
    • 在函数main_menu 中仅将break 替换为exit
    • 这就是我尝试过的,但没有任何反应。它不会返回主菜单。
    • 我已将您的代码作为 bash 脚本添加到我的回答中。它对我有用。
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2013-12-24
    • 2018-01-30
    相关资源
    最近更新 更多