web-dev-qa-db-ja.com

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
CybernetiX S3C

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_を参照)を使用すると、より良い結果が得られます。私はプログラマーではないので、これを手伝うことはできません。

1