Json 在 shell 脚本中解析
Json parsing in shell script
我正在尝试自动创建 github 存储库。下面是我的代码:
pushtogithub() {
git init
git config user.name "user name"
git config user.email "user email"
git add .
git commit -m "Initial commit"
content=$(curl -s -u githubusername:githubaccesstoken https://api.github.com/user/repos -d '{"name":"", "private":true}')
repo=$(jq -r '.ssh_url' <<< "${content}" )
echo $repo created
git remote add origin git@github.com:githubusername/$repo.git
git push -u origin master
}
我的 github 存储库总是使用 -1
名称创建。
我这里做错了什么?
替换:
curl ... -d '{"name":"", "private":true}'
...与:
curl ... -d "$(jq -n --arg name "" '{"name": $name, "private": true}')"
也就是说:您使用 jq
来 解析 JSON 的方式没有任何问题;问题是你试图 create JSON without using jq
.
顺便说一句,尝试解决此问题的简单但错误的方法是更改您的引用类型:
#### DO NOT DO THIS
curl ... -d '{"name": "'""'", "private": true}'
...或...
### DO NOT DO THIS EITHER
curl ... -d "{\"name\":\"\", \"private\":true}"
在第一个示例中,我们将所有内容 除了 </code> 都用单引号括起来;但是然后在扩展之前结束那些单引号,切换到双引号上下文,在那里扩展 <code>
,然后切换回来。
在第二个示例中,我们只是将整个内容放在双引号中,转义了那些旨在作为文字而不是句法的内容。
然而,这两种方法都是错误的;尝试查看当你的名字是 Foo "The Leet" Bar
时它做了什么——文字引号与 JSON 引号混淆,使生成的 JSON 无效,除非你使用工具(如 jq
) 知道如何逃避它们。
我正在尝试自动创建 github 存储库。下面是我的代码:
pushtogithub() {
git init
git config user.name "user name"
git config user.email "user email"
git add .
git commit -m "Initial commit"
content=$(curl -s -u githubusername:githubaccesstoken https://api.github.com/user/repos -d '{"name":"", "private":true}')
repo=$(jq -r '.ssh_url' <<< "${content}" )
echo $repo created
git remote add origin git@github.com:githubusername/$repo.git
git push -u origin master
}
我的 github 存储库总是使用 -1
名称创建。
我这里做错了什么?
替换:
curl ... -d '{"name":"", "private":true}'
...与:
curl ... -d "$(jq -n --arg name "" '{"name": $name, "private": true}')"
也就是说:您使用 jq
来 解析 JSON 的方式没有任何问题;问题是你试图 create JSON without using jq
.
顺便说一句,尝试解决此问题的简单但错误的方法是更改您的引用类型:
#### DO NOT DO THIS
curl ... -d '{"name": "'""'", "private": true}'
...或...
### DO NOT DO THIS EITHER
curl ... -d "{\"name\":\"\", \"private\":true}"
在第一个示例中,我们将所有内容 除了 </code> 都用单引号括起来;但是然后在扩展之前结束那些单引号,切换到双引号上下文,在那里扩展 <code>
,然后切换回来。
在第二个示例中,我们只是将整个内容放在双引号中,转义了那些旨在作为文字而不是句法的内容。
然而,这两种方法都是错误的;尝试查看当你的名字是 Foo "The Leet" Bar
时它做了什么——文字引号与 JSON 引号混淆,使生成的 JSON 无效,除非你使用工具(如 jq
) 知道如何逃避它们。