我正在尝试编写一个示例脚本,我正在生成像'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
错误。我尝试了各种引号等组合,但似乎没有任何效果!
我做错了什么?
答案 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}'