【问题标题】:How to pass bash variable to JSON如何将bash变量传递给JSON
【发布时间】:2018-02-17 08:06:14
【问题描述】:

我正在尝试编写一个示例脚本,其中我正在生成像“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": true}' "<URL>" >> create_repos_1.txt
    echo created $r_name
done

我总是收到"Problems parsing JSON" 错误。我尝试了各种引号组合等,但似乎没有任何效果!

我做错了什么?

【问题讨论】:

  • 附带说明,如果您开始以这种方式推送真实名称(来自数据库、来自网络表单),请escape他们。跨度>
  • 使用一值序列{1..1}有什么意义?
  • @RuudHelderman 这是个好建议!我会记住的
  • @RomanPerekhrest 哦,现在只需一推。稍后我会将其增加到 60!

标签: json bash curl github


【解决方案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}'

【讨论】:

  • 现在$r_name 没有被引用,所以当shell 扩展它时,它会受到分词和路径名扩展的影响。你想要-d '{"name": "'"$r_name"'", "private": true}'
  • 这对我有用。但是,我无法理解引号之间的区别:(
【解决方案2】:

不要;使用 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 控制字符),它也会失败。

【讨论】:

    【解决方案3】:

    另一种选择是使用printf 创建数据字符串:

    printf -v data '{"name": "%s", "private": true}' "$r_name"
    curl -i -H 'Authorization: token <token>' -d "$data" "$url" >> create_repos_1.txt
    

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2011-02-17
      • 1970-01-01
      • 2015-05-21
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多