web-dev-qa-db-ja.com

ダイアログradiolistの変数

次のダイアログラジオリストがありますが、これは正常に機能します。

#!/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"または"${ch1[@]}"に置き換えると、ch1の定義が異なっていても、結果が得られません。

私の最終的な目標は、動的なラジオリストを作成することです。含まれるすべての選択肢は文字列または配列です。私はすでに この解決策 を試しましたが、選択肢に空白が含まれていると機能しません。

2
Theo

--radiolistには、1つではなく2つの変数が必要です。 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.

上記のように、タグand itemとステータスの両方が必要です。そのため、1つだけ指定すると失敗します(その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.$$
3
terdon

私はもう少しねじれたケースに取り組んでいます。

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/

配列とスペース分割の詳細については、

http://zsh.sourceforge.net/FAQ/zshfaq03.html

1
nachoparker