如何将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控制字符),也会失败。

posted @ 2023-05-11 22:11  技术颜良  阅读(94)  评论(0编辑  收藏  举报