如何解决cURL:使用 bash 脚本时 URL 位置中的大括号不匹配
我正在尝试编写一个脚本,以便使用 REST API 轻松写入 Firebase 数据库。以下是导致问题的脚本部分:
#!/bin/bash
echo "patient username:"
read USER
echo "name:"
read NAME
echo "birthday:"
read BDAY
echo "insurance provider:"
read InsprOV
echo "insurance number:"
read INSNUMB
echo "group number:"
read GrpnUMB
form0="'"
form10='{\n "'
form1=${form0}${form10}
form2='": {\n "'
form3='name": "'
form4='",\n "birthday": "'
form5='",\n "insurance provider": "'
form6='",\n "insurance number": "'
form7='",\n "group number": "'
form8='"\n }\n}'
form9="' "
link="'https://billify-51384-default-rtdb.firebaseio.com/userinfo.json'"
#adding strings together
send1=${form1}${USER}
send2=${form2}${form3}
send3=${send2}${NAME}
send4=${send3}${form4}
send5=${send4}${BDAY}
send6=${send5}${form5}
send7=${send6}${InsprOV}
send8=${send7}${form6}
send9=${send8}${INSNUMB}
send10=${send9}${form7}
send11=${send10}${GrpnUMB}
send12=${send11}${form8}
send13=${send1}${send12}
send14=${send13}${form9}
URL=${send14}${link}
printf "$URL" >> tempfile.txt
URLFX=$(<tempfile.txt)
echo
echo "PRINTING DATA---------------------------------"
printf "$URLFX"
echo
curl -X PUT -d $URLFX
rm tempfile.txt
很抱歉所有的字符串组合,bash 在提高效率方面很糟糕! 我将 JSON 数据放入一个文本文件中,然后让脚本读取它以修复换行符问题(似乎确实如此)。当我运行脚本时,我得到以下输出:
PRINTING DATA---------------------------------
'{
"testuser": {
"name": "Johnny Smith","birthday": "January 3,1903","insurance provider": "CompanyName","insurance number": "101010","group number": "1010"
}
}' 'https://billify-51384-default-rtdb.firebaseio.com/userinfo.json'
curl: (3) URL using bad/illegal format or missing URL
curl: (3) unmatched brace in URL position 1:
{
^
它似乎正确地格式化了所有内容,因为当我手动将打印的数据添加到 cURL 命令时,它可以工作并添加数据。 cURL 的脚本问题是什么?谢谢!
解决方法
如果您已经将字符串存储到文件 tempfile.txt
中,为什么不直接上传文件本身。
此外,您还应该设置适当的标题。
curl -X "POST" "$URL" --data @tempfile.txt -H "Accept: application/json" -H "Content-Type: application/json" -H "User-Agent: MyScript/0.1"
,
当前的问题是缺少 $URLFX
周围的引号(这很有趣,看到您在打印时正确引用它)并且在 JSON 字符串周围添加了单引号,您可能将其放在以错误的方式解决引用问题。
代码中值周围的语法引号与这些值中的文字引号之间存在差异。只有前者会影响 shell 解析值的方式。观察 echo '
(语法错误)和 echo "'"
(由一个单引号组成的字符串,在句法双引号中以防止字符串被解释为语法)之间的区别。
解决这个问题,试试这个重构。
#!/bin/bash
read -r -p "patient username: " User
read -r -p "name: " Name
read -r -p "birthday: " Bday
read -r -p "insurance provider: " Insprov
read -r -p "insurance number: " Insnumb
read -r -p "group number: " Grpnumb
curl -X PUT -d "\
{
\"$User\":
{
\"name\": \"$Name\",\"birthday\": \"$Bday\",\"insurance provider\": \"$Insprov\",\"insurance number\": \"$Insnumb\",\"group number\": \"$Grpnumb\"
}
}" 'https://billify-51384-default-rtdb.firebaseio.com/userinfo.json'
像这样将发送到 URL 的 JSON 拆分成多行是不习惯的,但 Bash 可以很好地应对。在语法双引号中,我们需要反斜杠转义任何文字双引号以保留它们,这有点不吸引人。
还要注意 Correct Bash and shell script variable capitalization 并可能阅读 When to wrap quotes around a shell variable?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。