繁体   English   中英

cURL:使用 ZD574D4BB40C84891791A694A 时 URL position 中的大括号不匹配

[英]cURL: unmatched brace in URL position when using bash script

我正在尝试编写一个脚本,以便使用 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 可以很好地应对。 在语法双引号内,我们需要对任何文字双引号进行反斜杠转义以保留它们,这有点不吸引人。

另请注意更正 Bash 和 shell 脚本变量大写并可能阅读何时在 shell 变量周围加上引号?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM