首页 > 解决方案 > 在shell脚本中解析Json

问题描述

我正在尝试自动创建 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":"$1", "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名字创建。

我在这里做错了什么?

标签: shellcurljqgithub-api

解决方案


代替:

curl ... -d '{"name":"$1", "private":true}'

...和:

curl ... -d "$(jq -n --arg name "$1" '{"name": $name, "private": true}')"

也就是说:你jq用来解析JSON 的方式没有错;问题是您试图在使用.jq


顺便说一句,尝试解决此问题的简单但错误的方法是更改​​您的引用类型:

#### DO NOT DO THIS
curl ... -d '{"name": "'"$1"'", "private": true}'

...或者...

### DO NOT DO THIS EITHER
curl ... -d "{\"name\":\"$1\", \"private\":true}"

在第一个示例中,除了$1单引号括起来的所有内容;但是然后在展开之前结束那些单引号,切换到双引号上下文,在$1那里展开,然后切换回来。

在第二个示例中,我们只是将整个内容放在双引号中,转义那些旨在成为文字而不是句法的内容。

然而,任何一种方法都是错误的;尝试查看您的名字时它的作用Foo "The Leet" Bar——文字引号与 JSON 引号混淆,使生成的 JSON 无效,除非您使用jq知道如何转义它们的工具(如 )。


推荐阅读