JQ基于变量值获取密钥

时间:2017-12-21 03:00:14

标签: bash sh jq oh-my-zsh

我正在尝试根据Wade Wegner的指南here为Salesforce的DX CLI创建一个ohmyzsh函数。为了获得我想要的价值,我需要扩展他使用JQ的方式,这是我以前从未听说过的。我得到了这个用例的前提,但我正在努力解决一个抽象点(在aliasConfig json中)。这是我到目前为止的剧本

get_sfdx_defaultusername() {
    config="$(cat .sfdx/sfdx-config.json 2> /dev/null)";
    globalConfig="$(cat ~/.sfdx/sfdx-config.json)";
    aliasConfig="$(cat ~/.sfdx/alias.json)";

    defaultusername="$(echo ${config} | jq -r .defaultusername)"
    defaultusernamealias="NEED HELP HERE"
    globaldefaultusername="$(echo ${globalConfig} | jq -r .defaultusername)"

    if [ ! $defaultusernamealias = "null" ]
    then
      echoString=$echoString$defaultusernamealias"$txtylw (alias)"
    elif [ ! $defaultusername = "null" ]
    then
      echoString=$echoString$defaultusername"$txtylw (local)"
    else
      echoString=$echoString$globaldefaultusername"$txtylw (global)"
    fi
    echo $echoString"\n"
}

alias.json 如下所示:

{
    "orgs": {
        "HubOrg": "myemail@domain.com",        
        "my-scrath-org": "test-jdj1iflkor4k@mydomain.net"
    }
}

使用${defaultusername}我知道这个案例中的值是“test-jdj1iflkor4k@mydomain.net”,因此我需要将defaultusernamealias的值设置为“my-scrath-org” “

注意:我找到的最接近的答案是this,但不幸的是我仍然无法得到我需要的答案。

2 个答案:

答案 0 :(得分:2)

恭喜您了解如何使用to_entries

一个小建议是避免使用shell插值来构造" jq程序。实现预期目标的更好方法是在命令行上传递相关值。在您的情况下,以下是适当的:

$ jq --arg username "$defaultusername" '
  .orgs | to_entries[] | select(.value == $username ).key'

另一个小问题是避免使用echo将JSON发送到STDIN。有几种可能性,包括这些模式:

  • 如果您使用的是bash:jq .... <<< "$JSON"
  • 使用printf "%s" "$JSON" | jq ...
  • jq -n --argjson JSON "$JSON" '$JSON | ...'

在您的情况下,这些替代方案中的最后一个将如下所示:

$ jq --arg username "$defaultusername" --argjson JSON "$aliasConfig" '
    $JSON
    | .orgs | to_entries[] | select(.value == $username ).key'

答案 1 :(得分:0)

我想我在这里弄清楚了:

get_sfdx_defaultusername() {
    config="$(cat .sfdx/sfdx-config.json 2> /dev/null)";
    globalConfig="$(cat ~/.sfdx/sfdx-config.json)";
    aliasConfig="$(cat ~/.sfdx/alias.json)";

    defaultusername="$(echo ${config} | jq -r .defaultusername)"
    defaultusernamealias="$(echo ${aliasConfig} | jq -r '.orgs | to_entries[] | select(.value =="'$defaultusername'").key' )"
    globaldefaultusername="$(echo ${globalConfig} | jq -r .defaultusername)"

    if [ ! $defaultusernamealias = "null" ]
    then
        echoString=$echoString$defaultusernamealias"$txtylw (alias)"
    elif [ ! $defaultusername = "null" ]
    then
        echoString=$echoString$defaultusername"$txtylw (local)"
    else
        echoString=$echoString$globaldefaultusername"$txtylw (global)"
    fi
    echo $echoString"\n"
}

这允许我像这样显示我当前的defaultusername org: enter image description here

如果有人有兴趣使用或贡献它,我发布了github repo here