shell - 在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
名字创建。
我在这里做错了什么?
解决方案
代替:
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
知道如何转义它们的工具(如 )。
推荐阅读
- primefaces - p:dataTable 正在动态 p:dialog 中处理,即使没有显示对话框
- java - 为什么此共享图像仅适用于所有移动设备?
- java - Spring-boot JPA 持久化一对多关系
- c++ - C++ 意外退出 For 循环
- r - `gather` 不能处理行名
- omnet++ - VEINS 框架使用了哪些调度技术?(调度算法)
- python - Django 测试不会注意到“django.contrib.auth.context_processors.auth”
- php - PHP中的MYSQL执行
- python - 枚举后需要逗号才能正确输出要列出的值
- javascript - 如何根据其他输入值显示和隐藏输入 - 没有 JQuery