bash 如何创建带有子菜单的菜单

bash 如何创建带有子菜单的菜单

我需要帮助。我是 Bash Shell 编程的新手,我有任务要做。因此,我需要制作菜单并在菜单中制作子菜单。我的意思是,然后您按 5(数据库管理),它必须显示带有 3 个选项的子菜单。我尝试了一些 if 方法,但我无法完成。这是我的代码:

#!/bin/bash

PS3='Please enter your option: '
options=("Buy" "Sale" "Change data" "View cars" "Database management" "Calculate profits" "Sold cars" "Vechiles in stock" "Exit program")
select opt in "${options[@]}"
do
    case $opt in
    "Buy")
        echo "you chose choice 1"
        ;;
    "Sale")
        ;;
    "Change data")
        ;;
    "View cars")
        ;;
    "Database management")
    PS3='Please enter your option: '
    options=("1" "2" "3")
    select opt in "${options[@]}"
    do
    case $opt in
    "1")
        echo "you chose choice 1"
        ;;
    "2")
        echo "you chose choice 2"
    "3")
        echo "you chose choice 3"
        ;;
    "Calculate profits")
        ;;
    "Sold cars")
        ;;
    "Vechiles in stock")
        ;;
    "Exit program")
        break 
        ;;
    *)
        echo "invalid option $REPLY"
        ;;
    esac
done

如果按 5,则会弹出另一个菜单,其中包含“备份”,“删除”,“恢复”,谢谢。

答案1

我建议对子菜单使用 shell 函数 - 以及使代码更易于管理,它允许您定义一个,local PS3以便用户更轻松地跟踪他们所在的菜单。最小原型可能类似于

# submenu
submenu () {
  local PS3='Please enter sub option: '
  local options=("Sub menu item 1" "Sub menu item 2" "Sub menu quit")
  local opt
  select opt in "${options[@]}"
  do
      case $opt in
          "Sub menu item 1")
              echo "you chose sub item 1"
              ;;
          "Sub menu item 2")
              echo "you chose sub item 2"
              ;;
          "Sub menu quit")
              return
              ;;
          *) echo "invalid option $REPLY";;
      esac
  done
}

# main menu
PS3='Please enter main option: '
options=("Main menu item 1" "Submenu" "Main menu quit")
select opt in "${options[@]}"
do
    case $opt in
        "Main menu item 1")
            echo "you chose main item 1"
            ;;
        "Submenu")
            submenu
            ;;
        "Main menu quit")
            exit
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

当然,如果您愿意,您也可以在 shell 函数中定义主菜单。

答案2

我知道这是后期添加的 - 您也许可以使用我正在开发的这个菜单程序:https://github.com/steveh250/Unix-Menu-Program/tree/1.11

最新版本:https://github.com/steveh250/Unix-Menu-Program

相关内容