如何将bash变量传递给JSON

时间:2017-09-08 11:45:30

标签: json bash curl github

我正在尝试编写一个示例脚本,我正在生成像'student-101 ... student-160'这样的名字。我需要发布JSON数据,当我这样做时,我得到一个JSON解析错误。

这是我的剧本:

.tables

我总是收到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 错误。我尝试了各种引号等组合,但似乎没有任何效果!

我做错了什么?

3 个答案:

答案 0 :(得分:2)

唐&#39;吨;使用jq(或类似的东西)使用变量输入构建正确引用的JSON。

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控制字符,它就会失败并且也会失败。< / p>

答案 1 :(得分:2)

另一种选择是使用printf来创建数据字符串:

printf -v data '{"name": "%s", "private": true}' "$r_name"
curl -i -H 'Authorization: token <token>' -d "$data" "$url" >> create_repos_1.txt

答案 2 :(得分:1)

首先,您的name属性是一个字符串,因此您需要在json中为它添加双引号。

其次,使用单引号,bash不会进行变量扩展:它不会将$r_name替换为变量内容(有关详细信息,请参阅Expansion of variable inside single quotes in a command in bash shell script)。

总之,使用:

-d '{"name": "'"$r_name"'", "private": true}'