bashshell脚本-对话框表单变量

bashshell脚本-对话框表单变量,bash,shell,variables,scripting,Bash,Shell,Variables,Scripting,所以,我刚刚开始编写Shell脚本,我正在开发一个地址簿 对于要插入联系人的用户,我制作了以下表单: form=$(dialog \ --title "INSERIR" \ --form "" \ 0 0 0

所以,我刚刚开始编写Shell脚本,我正在开发一个地址簿

对于要插入联系人的用户,我制作了以下表单:

form=$(dialog                                      \
    --title "INSERIR"                              \
    --form  ""                                     \
    0 0 0                                          \
    "Nome:"      1 1    "$nome"     1 10 20 0      \
    "Morada:"    2 1    "$morada"   2 10 20 0      \
    "Telefone:"  3 1    "$telefone"     3 10 20 0  \
    "E-Mail:"    4 1    "$mail"     4 10 20 0      \  
2>&1 1>&3)
我想通过MySQL查询插入这些值。我看到了我必须使用的地方,例如:

form[$1]
以访问变量$nome。然而,这是2008年的评论。 访问这些变量的最简单方法是什么


谢谢大家!

关于访问结果的最简单方法的问题部分取决于项目是否包含空格。如果项目可以包含任意数据,那么面向行的输出(默认)似乎是唯一的方法。如果它们更受约束,例如,不包含一些可以用作分隔符的常用标点符号,则会使其更简单

中提到了一个可用于执行此操作的选项(和别名):

--分隔符
字符串

--输出分隔符
字符串

指定一个字符串,将对话框输出上的输出与检查列表分开,而不是换行符(对于
--separate output
)或空格。这适用于其他小部件,如表单 和通常使用换行符的编辑框

例如,如果数据不包含
(冒号),则可以使用该选项

--output-separator :
并在一行上获取以冒号分隔的值

如果字符串中没有逗号或引号,则可以使用

--output-separator \",\"

并将结果直接嵌入到SQL语句中。但是,逗号比前面提到的其他标点符号出现得更频繁,因此使用
sed
处理表单输出是最可能的处理方式。

关于访问结果的最简单方式的问题部分取决于项目是否包含空格。如果项目可以包含任意数据,那么面向行的输出(默认)似乎是唯一的方法。如果它们更受约束,例如,不包含一些可以用作分隔符的常用标点符号,则会使其更简单

中提到了一个可用于执行此操作的选项(和别名):

--分隔符
字符串

--输出分隔符
字符串

指定一个字符串,将对话框输出上的输出与检查列表分开,而不是换行符(对于
--separate output
)或空格。这适用于其他小部件,如表单 和通常使用换行符的编辑框

例如,如果数据不包含
(冒号),则可以使用该选项

--output-separator :
并在一行上获取以冒号分隔的值

如果字符串中没有逗号或引号,则可以使用

--output-separator \",\"

并将结果直接嵌入到SQL语句中。但是,逗号比前面提到的其他标点符号出现得更频繁,因此使用
sed
处理表单输出是最有可能的处理方式。

因此,经过一点修补,我得到了我想要的东西。 以下是新表格:

exec 3>&1

dialog                                             \
--separate-widget $'\n'                            \
--title "INSERIR"                                  \
--form ""                                          \
0 0 0                                              \
"Nome:"     1 1 "$nome"     1 10 30 0              \
"Morada:"       2 1     "$morada"       2 10 30 0  \
"Telefone:"     3 1     "$telefone" 3 10 30 0      \
"E-Mail:"       4 1     "$mail"         4 10 30 0  \
2>&1 1>&3 | {
    read -r nome
    read -r morada
    read -r telefone
    read -r mail

    #The rest of the script goes here
}

exec 3>&-

所以,经过一点修补,我得到了我想要的东西。 以下是新表格:

exec 3>&1

dialog                                             \
--separate-widget $'\n'                            \
--title "INSERIR"                                  \
--form ""                                          \
0 0 0                                              \
"Nome:"     1 1 "$nome"     1 10 30 0              \
"Morada:"       2 1     "$morada"       2 10 30 0  \
"Telefone:"     3 1     "$telefone" 3 10 30 0      \
"E-Mail:"       4 1     "$mail"         4 10 30 0  \
2>&1 1>&3 | {
    read -r nome
    read -r morada
    read -r telefone
    read -r mail

    #The rest of the script goes here
}

exec 3>&-

IFS=$'\n'read-r-d''nome-morada telefone mail<
IFS=$'\n'read-r-d''nome-morada telefone mail<经过几天的寻找,我用你的表格得到了这些变量:

nome=""
morada=""
telefone=""
mail=""

user_record=$(\
dialog                                             \
--separate-widget $'\n'                            \
--title "INSERIR"                                  \
--form ""                                          \
0 0 0                                              \
"Nome:"     1 1 "$nome"     1 10 30 0              \
"Morada:"       2 1     "$morada"       2 10 30 0  \
"Telefone:"     3 1     "$telefone" 3 10 30 0      \
"E-Mail:"       4 1     "$mail"         4 10 30 0  \
  3>&1 1>&2 2>&3 3>&- \
)
nome=$(echo "$user_record" | sed -n 1p)
morada=$(echo "$user_record" | sed -n 2p)
telefone=$(echo "$user_record" | sed -n 3p)
mail=$(echo "$user_record" | sed -n 4p)

echo $nome
echo $morada
echo $telefone
echo $mail
这样,您可以在以后的脚本中使用这些变量。
希望它能帮助其他人。

经过几天的探索,我找到了一种方法,将这些变量与您的表单一起使用:

nome=""
morada=""
telefone=""
mail=""

user_record=$(\
dialog                                             \
--separate-widget $'\n'                            \
--title "INSERIR"                                  \
--form ""                                          \
0 0 0                                              \
"Nome:"     1 1 "$nome"     1 10 30 0              \
"Morada:"       2 1     "$morada"       2 10 30 0  \
"Telefone:"     3 1     "$telefone" 3 10 30 0      \
"E-Mail:"       4 1     "$mail"         4 10 30 0  \
  3>&1 1>&2 2>&3 3>&- \
)
nome=$(echo "$user_record" | sed -n 1p)
morada=$(echo "$user_record" | sed -n 2p)
telefone=$(echo "$user_record" | sed -n 3p)
mail=$(echo "$user_record" | sed -n 4p)

echo $nome
echo $morada
echo $telefone
echo $mail
这样,您可以在以后的脚本中使用这些变量。
希望它能帮助其他人。

因此,您可以将输出放入一个数组并处理它。避免所有子shell/子流程垃圾。(只需相信轻率的重定向,是的,它很难看,但你基本上只是将stdin替换掉并将其替换回来。)不知道为什么5年后这会如此难以捉摸,但嘿。我觉得默默无闻很酷

response=$(dialog                                  \
    --title "INSERIR"                              \
    --form  ""                                     \
    0 0 0                                          \
    "Nome:"      1 1    "$nome"     1 10 20 0      \
    "Morada:"    2 1    "$morada"   2 10 20 0      \
    "Telefone:"  3 1    "$telefone"     3 10 20 0  \
    "E-Mail:"    4 1    "$mail"     4 10 20 0      \  
    3>&1 1>&2 2>&3 3>&-)

#convert the space separated string to an array.. the madness!!
responsearray=($response)

echo ${responsearray[0]} #nome
echo $(responsearray[1]} #morada
echo ${responsearray[2]} #telefone
echo ${responsearray[3]} #mail

…鲍勃是你叔叔

因此,您可以将输出放入一个数组中并处理它。避免所有子shell/子流程垃圾。(只需相信轻率的重定向,是的,它很难看,但你基本上只是将stdin替换掉并将其替换回来。)不知道为什么5年后这会如此难以捉摸,但嘿。我觉得默默无闻很酷

response=$(dialog                                  \
    --title "INSERIR"                              \
    --form  ""                                     \
    0 0 0                                          \
    "Nome:"      1 1    "$nome"     1 10 20 0      \
    "Morada:"    2 1    "$morada"   2 10 20 0      \
    "Telefone:"  3 1    "$telefone"     3 10 20 0  \
    "E-Mail:"    4 1    "$mail"     4 10 20 0      \  
    3>&1 1>&2 2>&3 3>&-)

#convert the space separated string to an array.. the madness!!
responsearray=($response)

echo ${responsearray[0]} #nome
echo $(responsearray[1]} #morada
echo ${responsearray[2]} #telefone
echo ${responsearray[3]} #mail

…鲍勃是你叔叔

对话框
命令的输出是什么?
form
变量将以字符串(而不是数组)的形式包含精确的输出(删除尾随空格)。因此,
${form[1]}
/等数组索引语法在这里是不正确的。实际上,它在一个字符串中输出所有变量,末尾带有[]。请显示输出。例如:Ricardo Boulevard Avenue+35191256835loremipsum@gmail.com[]从文件来看,输出是换行分隔的,这意味着您需要逐行读取输出,而不仅仅是将其全部填充到一个变量中。该
对话框
命令的输出是什么?
form
变量将以字符串(而不是数组)的形式包含精确的输出(删除尾随空格)。因此,
${form[1]}
/等数组索引语法在这里是不正确的。实际上,它在一个字符串中输出所有变量,末尾带有[]。请显示输出。例如:Ricardo Boulevard Avenue+35191256835loremipsum@gmail.com[]从文件来看,输出是换行分隔的,这意味着您需要逐行读取输出,而不仅仅是将其全部填充到一个变量中。这在子shell中运行“脚本的其余部分”——在这个特定的用例中可以工作,但在很多情况下不会工作(如果您尝试在函数中执行对话框调用,并且希望能够返回,该怎么办)?在子shell中运行“脚本的其余部分”——适用于此特定用例