bashshell脚本-对话框表单变量
所以,我刚刚开始编写Shell脚本,我正在开发一个地址簿 对于要插入联系人的用户,我制作了以下表单:bashshell脚本-对话框表单变量,bash,shell,variables,scripting,Bash,Shell,Variables,Scripting,所以,我刚刚开始编写Shell脚本,我正在开发一个地址簿 对于要插入联系人的用户,我制作了以下表单: form=$(dialog \ --title "INSERIR" \ --form "" \ 0 0 0
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中运行“脚本的其余部分”——适用于此特定用例