我有以下对话框广播列表,效果很好。
#!/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
,我也不会得到任何结果。
我的最终目标是创建一个动态广播列表,其中包含的所有选择都是字符串或数组。我已经尝试过了这个解决方案,但当选项包含空格时它不起作用。
答案1
需要--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.
正如您在上面看到的,它需要两个标签和项目,以及状态。这就是为什么当你只给它一个时它会失败(即使那个被扩展为一个数组)。
您仍然可以使用数组,但需要执行以下操作:
#!/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
是一个通常包含空格的 shell 变量,这就是使此示例变得复杂的原因。我如何让 dialog 区分 中的空格$DESC
和分隔其参数的空格?
我决定使用数组,因为无论如何它们是避免此类问题的更自然的方法。
您可以看到完整的代码和结果
https://ownyourbits.com/2017/03/05/generic-software-installer-for-raspbian/
有关数组与空间分割的更多信息,请参见