我正在尝试创建一个具有可变数量输入字段的 Bash 对话框表单。例如,此代码是一个静态代码,允许输入四条信息:
exec 3>&1
VALUES=$(dialog --ok-label "Submit" \
--backtitle "Test input form" \
--title " Type information in " \
--form "" 12 95 0 \
"Item 1 :" 1 1 "$Item1" 1 15 65 256 "Item 2 :" 2 1 "$Item2" 2 15 65 256 "Item 3 :" 3 1 "$Item3" 3 15 65 256 "Item 4 :" 4 1 "$Item4" 4 15 65 256 \
2>&1 1>&3)
exec 3>&-
效果很好。所以现在我想尝试一下:
ITEMS=4; unset ITEMSTRING
for ((i=1; i<=$ITEMS; i++))
do
ITEMSTRING=$ITEMSTRING"\"Item $i :\" $i 1 \"\$Item$i\" $i 15 65 256 "
done
ITEMSTRING="$ITEMSTRING\\"
echo -e "$ITEMSTRING"
...输出这个字符串:
"Item 1 :" 1 1 "$Item1" 1 15 65 256 "Item 2 :" 2 1 "$Item2" 2 15 65 256 "Item 3 :" 3 1 "$Item3" 3 15 65 256 "Item 4 :" 4 1 "$Item4" 4 15 65 256 \
该字符串与之前的对话框脚本中包含的字符串相同,所以我想我能够做到这一点:
exec 3>&1
VALUES=$(dialog --ok-label "Submit" \
--backtitle "Test input form" \
--title " Type information in " \
--form "" 12 95 0 \
$ITEMSTRING
2>&1 1>&3)
exec 3>&-
但这只会产生错误:“预期 8 个参数,发现额外的 1 个。”我尝试双引号 $ITEMSTRING 变量:“预计 --form 至少有 20 个标记,有 5 个。”
是否可以以这种方式动态构造对话框命令?我可以尝试什么来将 ITEMSTRING 变量解释为它实际包含的文本?
显然,目标是能够更改 ITEMS 的值,从而构建一个具有 4、6 或 19 个用户输入字段的用户输入对话框,具体取决于上下文。
嗯...不太确定在这种情况下如何正确解释字符串...本身就是一个有趣的问题...
但一般来说,当我想以这种方式传递参数时,其中一些可能是“带空格的字符串”,最可靠的方法是捕获数组中的每个参数,然后在需要时分解数组。
这对我有用:
#!/bin/bash
Item1="one"
Item2="two"
Item3="three"
Item4="four"
ITEMS=4;
unset ITEMSTRING
declare -a ITEMSTRING
for ((i=1; i<=$ITEMS; i++))
do
ITEMSTRING[${#ITEMSTRING[@]}]="Item $i :"
ITEMSTRING[${#ITEMSTRING[@]}]="$i"
ITEMSTRING[${#ITEMSTRING[@]}]=1
REF="Item$i"
ITEMSTRING[${#ITEMSTRING[@]}]="${!REF}"
ITEMSTRING[${#ITEMSTRING[@]}]="$i"
ITEMSTRING[${#ITEMSTRING[@]}]=15
ITEMSTRING[${#ITEMSTRING[@]}]=65
ITEMSTRING[${#ITEMSTRING[@]}]=256
done
exec 3>&1
VALUES=$( 2>&1 1>&3 dialog --ok-label "Submit" \
--backtitle "Test input form" \
--title " Type information in " \
--form "" 12 95 0 \
"${ITEMSTRING[@]}"
)
exec 3>&-