bash 对话框输入框中输入的数量可变

问题描述 投票:0回答:1

我正在尝试创建一个具有可变数量输入字段的 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 个用户输入字段的用户输入对话框,具体取决于上下文。

bash forms dialog
1个回答
0
投票

嗯...不太确定在这种情况下如何正确解释字符串...本身就是一个有趣的问题...

但一般来说,当我想以这种方式传递参数时,其中一些可能是“带空格的字符串”,最可靠的方法是捕获数组中的每个参数,然后在需要时分解数组。

这对我有用:

#!/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>&-
© www.soinside.com 2019 - 2024. All rights reserved.