如何将bash变量传递给JSON
我正在尝试编写示例脚本,在其中生成诸如" student-101 ... student-160"之类的名称。 我需要发布JSON数据,当我这样做时,出现JSON解析错误。
这是我的脚本:
1
2 3 4 5 6 7 8 9 |
name="student-10"
for i in {1..1} do r_name=$name$i echo $r_name curl -i -H 'Authorization: token <token>' -d '{"name": $r_name,"private": true}'"<URL>">> create_repos_1.txt echo created $r_name done |
我总是收到"Problems parsing JSON"错误。 我已经尝试过各种引号的组合,等等,但是似乎没有任何效果!
我究竟做错了什么?
- 附带说明一下,如果您曾经以这种方式(从数据库,Web表单)开始推送实名,请避免使用。
- 使用1值序列{1..1}有什么意义?
- @RuudHelderman那是个好建议! 牢记在心
- @RomanPerekhrest哦,此刻只推一推。 以后再增加到60!
另一个选择是使用printf创建数据字符串:
1
2 |
printf -v data '{"name":"%s","private": true}'"$r_name"
curl -i -H 'Authorization: token <token>' -d"$data""$url">> create_repos_1.txt |
首先,您的name属性是一个字符串,因此您需要在json中为其添加双引号。
其次,使用单引号,bash不会进行变量扩展:它不会用变量内容替换$r_name(有关更多信息,请参见bash shell脚本中命令中单引号内变量的扩展)。
总之,使用:
1
|
-d '{"name":"'"$r_name"'","private": true}'
|
- 现在,您已经用$r_name取消了引号,因此在shell对其进行扩展时,将对其进行分词和路径名扩展。 您要-d {"name":""$r_name"","private": true}
- 这对我有用。 但是,我无法理解引号之间的区别:(
别; 使用jq(或类似名称)使用变量输入来构建正确引用的JSON。
1
2 3 4 5 6 7 8 9 |
name="student-10"
for i in {1..1} do r_name=$name$i jq -n --arg r_name"$r_name" '{name: $r_name, private: true}' | curl -i -H 'Authorization: token <token>' -d @-"<URL>">> create_repos_1.txt echo created $r_name done |
@-自变量告诉curl从标准输入(通过jq的管道)读取数据以用于-d。
类似于"{\\"name\\": \\"$r_name\\", \\"private\\": true}"的方法可能会起作用,但是它很丑陋,并且如果r_name包含需要在结果JSON中加引号的任何字符(例如双引号或ASCII控制字符),也会失败。