私は現在、メニューベースのコンテキストと関数を使用して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
このダイアログボックスにサブメニューを追加するにはどうすればよいですか?
たとえば、カテゴリとして最初のメインメニューが必要です。各メインカテゴリのサブカテゴリなど。
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"
_
ただし、2番目のメニューはdialog
を呼び出した時点で定義されており、ユーザーが最初のメニューで何を選択したかに依存することはできません。
dialog
実行可能ファイル(つまり、dialog(1)
)ではうまくいかないようです。おそらく、ダイアログライブラリ(dialog(3)
、_man 3 dialog
_を参照)を使用すると、より良い結果が得られます。私はプログラマーではないので、これを手伝うことはできません。