ユーザーフレンドリーなメニューを表示したいですwhiptail
。
私の目標whiptail
は次のとおりです。
Choice1
Choice2
Choice3
Choice4
私の配列には次のものがあります。
Choice1 Choice2 Choice3 Choice4
次のループを介して配列を実行しています。
for value in ${value[@]}
do
echo "$value"
done
whiptail
4つのメニューがあり、内部エコーを追加することはできません。
私は次のスクリプトを試しました。
$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
ます。Choice
Choice4
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"
}