如何使用 BASH 中的对话框为主菜单选项添加子菜单选项?

如何使用 BASH 中的对话框为主菜单选项添加子菜单选项?

我目前正在使用基于菜单的上下文和功能编写一个 bash 脚本。一切都运行正常。但我想更改和编辑一些选项,同时为每个选项添加子菜单。

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
BACKTITLE="Backtitle here"
TITLE="Title here"
MENU="Choose one of the following options:"

OPTIONS=(1 "Option 1"
         2 "Option 2"
         3 "Option 3")

CHOICE=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            echo "You chose Option 1"
            ;;
        2)
            echo "You chose Option 2"
            ;;
        3)
            echo "You chose Option 3"
            ;;
esac

我该如何将子菜单添加到该对话框?

例如,我需要将第一个主菜单作为类别。每个主类别中的子类别,等等。

答案1

只需在语句中运行另一个对话框即可case。如下所示:

#!/bin/sh

choice=$(dialog \
   --input-fd  2 \
   --output-fd 1 \
   --menu main 10 40 5 1 A 2 B \
)

case "$choice" in
   1)
      choiceA=$(dialog --input-fd 2 --output-fd 1 --menu sub-A 10 30 5 1 A1 2 A2)
      ;;
   2)
      choiceB=$(dialog --input-fd 2 --output-fd 1 --menu sub-B 10 30 5 1 B1 2 B2)
      ;;
esac

stty sane
clear

如果您希望用户能够返回到第一个菜单,那么您需要在脚本中实现这一点(可能使用--default-item)。

缺点是每个都会dialog自行重写屏幕。我找不到任何选项来保留旧内容(上一个留下的dialog)并只在其上绘制。因此您无法通过这种方式创建级联菜单。

--and-widget,一般来说你可以这样做:

#!/bin/sh

choice=$(dialog \
   --input-fd  2 \
   --output-fd 1 \
   --begin 2 2 \
   --menu first 10 40 5 1 A 2 B \
   --and-widget --begin 4 4 \
   --menu second 10 40 5 11 X 22 Y \
)

stty sane
clear

echo "$choice"

但是第二个菜单是在您调用时定义的dialog,它不能依赖于用户在第一个菜单中选择的内容。

似乎无法用dialog可执行文件(即dialog(1))做得更好。也许可以用对话框库(dialog(3),请参阅man 3 dialog)做得更好。我不是程序员,对此我无能为力。

相关内容