ホップテールメニューに配置 - BASH

ホップテールメニューに配置 - BASH

ユーザーフレンドリーなメニューを表示したいですwhiptail

私の目標whiptailは次のとおりです。

Choice1
Choice2
Choice3
Choice4

私の配列には次のものがあります。

Choice1 Choice2 Choice3 Choice4

次のループを介して配列を実行しています。

for value in ${value[@]}
do
    echo "$value"
done

whiptail4つのメニューがあり、内部エコーを追加することはできません。

私は次のスクリプトを試しました。

$val=$(whiptail --title "xx" --menu "choose" 16 78 10
for value in ${value[@]}
do
    echo "$value"
done
3>&1 1>&2 2>&3)

上記のスクリプトを実行した後、私のシェルはひどいようです。

スクリプト後のシェル:

ここに画像の説明を入力してください。

誰でも私の問題を解決できますか?

答え1

スクリプトにいくつかのエラーがあります。たとえば、ループイテレータに配列自体と同じ名前を指定しないでください。ただし、これを行うためにループは必要ありません。特別な配列インデックスを使用してすべての配列要素を一度に配置するだけです@

value=(Choice1 "" Choice2 "" Choice3 "" Choice4 "")
whiptail --title "xx" --menu "choose" 16 78 10 "${value[@]}"

引用符の中の空の文字列に注意してください""。これはメニューオプションの必須説明であり、この文字列がない場合は説明として扱われwhiptailます。ChoiceChoice4

Choice1 Choice2
Choice3 Choice4

あなたが望むものではないかもしれません。

答え2

チェックボックスメニューが必要な場合:

checkboxes () 
{ 
    local -A checkboxes;
    checkboxes["foo"]=off;
    checkboxes["bar"]=on;
    checkboxes["eric"]=on;

    backtitle="Backtitle";
    title="Title";
    question="Please choose:";

    choices=();
    for key in "${!checkboxes[@]}";
    do
        choices+=("$key" "" "${checkboxes[$key]}");
    done;

    result=$(
        whiptail --backtitle "$backtitle" \
                 --title "$title"         \
                 --checklist "$text"      \
                 0 0 0 "${choices[@]}"    \
                 3>&2 2>&1 1>&3-
    );
    echo "$result"
}

関連情報