私はうまく機能する次の会話のリストを持っています。
#!/bin/bash
ch1a="1"
ch1b="Fri, 20/3/15"
ch2a="2"
ch2b="Sun, 21/6/15"
ch1="\"$ch1a\" \"$ch1b\""
dialog --title "Equinoxes and Solistices" \
--radiolist "When is the Winter Solictice?" 15 60 4 \
"$ch1a" "$ch1b" ON \
"$ch2a" "$ch2b" OFF \
"3" "Wed, 23/9/15" OFF \
'4' 'Mon, 21/12/15' OFF 2>/tmp/menu.sh.$$
"$ch1"
しかし、最初のセレクタを or に置き換えると、"${ch1[@]}"
の定義が異なってもch1
結果は出ません。
私の究極の目標は、含まれているすべての選択肢が文字列または配列である動的放送リストを作成することです。私はすでに試しました。このソリューションただし、オプションにスペースが含まれている場合は機能しません。
答え1
1つではなく2つの変数が必要です--radiolist
。説明したようにman dialog
:
--radiolist text height width list-height [ tag item status ] ...
A radiolist box is similar to a menu box. The only difference is
that you can indicate which entry is currently selected, by setting
its status to on.
上に示すように、2つのタグが必要です。そしてプロジェクトとステータス。これがただ1つだけ提供されると失敗する理由です。
それでも配列を使用できますが、次のことを行う必要があります。
#!/bin/bash
ch=( "1" "Fri, 20/3/15" "2" "Sun, 21/6/15" "3" "Wed, 23/9/15"
"4" "Mon, 21/12/15")
dialog --title "Equinoxes and Solistices" \
--radiolist "When is the Winter Solictice?" 15 60 4 \
"${ch[0]}" "${ch[1]}" ON \
"${ch[2]}" "${ch[3]}" OFF \
"${ch[4]}" "${ch[5]}" OFF \
"${ch[6]}" "${ch[7]}" OFF 2>/tmp/menu.sh.$$
答え2
少しねじれたケースを作業してみました。
Theoが上記のようにオートコンプリートオプションを繰り返す状況にあります。シェル脱出スペースは難しいかもしれないので、これが私がしたことです。
local LIST=()
for item in *.sh; do
local DESC="$( grep "DESCRIPTION=" $item | sed 's|^DESCRIPTION=||' )"
LIST+=( $( basename $item .sh ) "$DESC" off )
done
local script
script=$( dialog --backtitle "NextCloudPi configuration" \
--radiolist "Select program to configure and activate:" 20 80 10 \
"${LIST[@]}" \
3>&1 1>&2 2>&3 )
echo "$script was selected"
$DESC
通常、スペースを含むシェル変数のため、この例は複雑になります。ダイアログボックス内のスペース$DESC
とそのパラメータを区切るスペースをどのように区別できますか?
とにかく、そのような問題を避けることがより自然な方法であるので、配列を使用することにしました。
完全なコードと結果を見ることができます
https://ownyourbits.com/2017/03/05/generic-software-installer-for-raspbian/
配列と空間分割の詳細については、次を参照してください。