【问题标题】:Cannot use/pass shell variables using jq on command line无法在命令行上使用 jq 使用/传递 shell 变量
【发布时间】:2020-01-10 18:11:05
【问题描述】:

我是 jq 的新手,我正在使用本教程将新的组织添加到超级账本结构网络中。

整个教程都大量使用了 jq,尤其是修改 json 文件。

本教程使用示例组织名称,但我试图使组织名称动态化。一切都很顺利,除非我尝试将变量传递给 jq。

这是 jq 命令及其输出。

jq 版本:1.5.1

$ 导出 MSPID=Org4MSP $回声$MSPID 组织4MSP

尝试使用 env 传递变量。

关键字:env.MSPID

$ jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"env.MSPID":.[1]}}}}}' config.json org4.json

输出 sn-p:它不打印 Org4MSP,而是打印文字字符串 env.MSPID

      "env.MSPID": {
        "groups": {},
        "mod_policy": "Admins",
        "policies": {
          "Admins": {
            "mod_policy": "Admins",
            "policy": {
              "type": 1,
              "value": {
                "identities": [
                  {

尝试使用 --arg 选项传递变量

关键字:“$MSP”

jq --arg MSP "$MSPID" -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"$MSP":.[1]}}}}}' config.json org4.json

输出 sn-p:它不打印 Org4MSP,而是打印文字字符串 $MSP

      "$MSP": {
        "groups": {},
        "mod_policy": "Admins",
        "policies": {
          "Admins": {
            "mod_policy": "Admins",
            "policy": {
              "type": 1,
              "value": {
                "identities": [
                  {

尝试使用 --arg 选项而不使用双引号来传递变量:

关键字:$MSP

$ jq --arg MSP "$MSPID" -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {$MSP:.[1]}}}}}' config.json org4.json

jq: error: syntax error, unexpected ':', expecting '}' (Unix shell quoting issues?) at , line 1:

.[0] * {"channel_group":{"groups":{"Application":{"groups": {$MSP:.[1]}}}}}

jq: 1 编译错误

尝试使用 env 传递变量。并且没有双引号:

关键字:env.MSPID

$ jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {env.MSPID:.[1]}}}}}' config.json org4.json

jq: 错误:语法错误,意外 FIELD,期待 '}'(Unix shell 引用问题?)在第 1 行:

.[0] * {"channel_group":{"groups":{"Application":{"groups": {env.MSPID:.[1]}}}}}

jq: 1 编译错误

如果这似乎是一个微不足道的问题,我深表歉意,但我在网上和文档中进行了搜索,但不明白为什么 JSON 键不会转换为 shell 变量的值。

谢谢

【问题讨论】:

    标签: environment-variables key command-line-arguments jq


    【解决方案1】:

    环境变量

    在你的子表达式中:

    {"env.MSPID":.[1]}
    

    您已经引用了env.MSPID,从而使其成为文字字符串。既然你想调用env 函数,你应该写:

    { (env.MSPID):.[1]}
    

    需要括号以确保 jq 正确评估括号内的表达式。

    {$MSP:.[1]}

    如上所述,当必须计算表达式以确定键的字符串值时,表达式必须用括号括起来,例如

     {($MSP):.[1]}
    

    【讨论】:

    • 优秀。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 2013-06-26
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多