微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cURL:使用 bash 脚本时 URL 位置中的大括号不匹配

如何解决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 举报,一经查实,本站将立刻删除。