我目前正在使用基于菜单的上下文和功能编写一个 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
)做得更好。我不是程序员,对此我无能为力。