如何将bash变量传递给JSON
我正在尝试编写一个示例脚本,在其中生成像“student-101…student-160”这样的名称。我需要发布JSON数据,当我发布数据时,我会得到一个JSON解析错误 这是我的剧本:如何将bash变量传递给JSON,json,bash,curl,github,Json,Bash,Curl,Github,我正在尝试编写一个示例脚本,在其中生成像“student-101…student-160”这样的名称。我需要发布JSON数据,当我发布数据时,我会得到一个JSON解析错误 这是我的剧本: 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
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
name=“学生-10”
对于{1..1}中的i
做
r_name=$name$i
echo$r_名称
curl-i-H'Authorization:token'-d'{“name”:$r_name,“private”:true}'>>create_repos_1.txt
echo创建了$r\u名称
完成
我总是遇到一个“解析JSON时出现问题”
错误。我尝试过各种引用的组合,但似乎没有任何效果
我做错了什么?首先,您的
name
属性是一个字符串,因此需要在json中为其添加双引号
其次,使用单引号,bash不会进行变量扩展:它不会用变量内容替换$r\u name
(有关更多信息,请参阅)
总之,使用:
-d '{"name": "'"$r_name"'", "private": true}'
首先,您的
name
属性是一个字符串,因此需要在json中为其添加双引号
其次,使用单引号,bash不会进行变量扩展:它不会用变量内容替换$r\u name
(有关更多信息,请参阅)
总之,使用:
-d '{"name": "'"$r_name"'", "private": true}'
不要;使用
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
name=“学生-10”
对于{1..1}中的i
做
r_name=$name$i
jq-n--arg r_name“$r_name”{name:$r_name,private:true}|
curl-i-H'Authorization:token'-d@-“”>>create\u repos\u 1.txt
echo创建了$r\u名称
完成
@-
参数告诉curl
从标准输入读取数据(通过管道从jq
)以用于-d
类似于
“{\'name\”:“$r\u name\”,“'private\”:true}”
的方法可能会起作用,但如果r\u name
包含任何需要在结果JSON中引用的字符,例如双引号或ASCII控制字符,则该方法很难看,并且也会失败。不要;使用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
name=“学生-10”
对于{1..1}中的i
做
r_name=$name$i
jq-n--arg r_name“$r_name”{name:$r_name,private:true}|
curl-i-H'Authorization:token'-d@-“”>>create\u repos\u 1.txt
echo创建了$r\u名称
完成
@-
参数告诉curl
从标准输入读取数据(通过管道从jq
)以用于-d
类似于
“{\'name\”:“$r\u name\”,“'private\”:true}”的东西可能会起作用,但是如果r\u name
包含任何需要在结果JSON中引用的字符,例如双引号或ASCII控制字符,那么它会很难看,并且也会失败。另一个选项是使用printf
来创建数据字符串:
printf -v data '{"name": "%s", "private": true}' "$r_name"
curl -i -H 'Authorization: token <token>' -d "$data" "$url" >> create_repos_1.txt
printf-v数据'{“名称”:“%s”,“private”:true}'$r_name”
curl-i-H'Authorization:token'-d“$data”“$url”>>create_repos_1.txt
另一个选项是使用printf
创建数据字符串:
printf -v data '{"name": "%s", "private": true}' "$r_name"
curl -i -H 'Authorization: token <token>' -d "$data" "$url" >> create_repos_1.txt
printf-v数据'{“名称”:“%s”,“private”:true}'$r_name”
curl-i-H'Authorization:token'-d“$data”“$url”>>create_repos_1.txt
作为旁注,如果你开始用这种方式(从数据库、从web表单)推真名,那么请取悦他们。使用1值序列{1..1}
有什么意义?@RuudHelderman这是个好建议!我会把它放在里面mind@RomanPerekhrest哦,现在就推一下。我以后会增加到60!顺便说一句,如果你开始用这种方式(从数据库、网络表单)推真名,那么请取悦他们。使用单值序列{1..1}
有什么意义?@RuudHelderman这是一个很好的建议!我会把它放在里面mind@RomanPerekhrest哦,现在就推一下。我以后会增加到60!现在您的$r_name
没有引号,因此当shell扩展它时,它将受到单词拆分和路径名扩展的影响。你想要-d'{“name”:““$r_name””,“private”:true}”
这对我很有效。但是,我无法理解引号之间的区别:(您现在有了$r_name
无引号,因此当shell扩展它时,它将进行分词和路径名扩展。您需要-d'{“name”:“$r_name””,“private”:true}“
这对我来说很有效。但是,我无法理解引号之间的区别:(