web-dev-qa-db-ja.com

引数をjqフィルターに渡す

これが私のconfig.jsonです:

{
    "env": "dev",
    "dev": {
        "projects" : {
            "prj1": {
                "dependencies": {},
                "description": ""
            }
        }
    }
}

ここに私のbashコマンドがあります:

PRJNAME='prj1'

echo $PRJNAME

jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json 
jq '.dev.projects.prj1' config.json 

出力:

prj1
null
{
  "dependencies": {},
  "description": ""
}

したがって、$ PRJNAMEはprj1ですが、最初の呼び出しではnullのみが出力されます。

誰かが私を助けることができますか?

24
lisi4ok

この例のjqプログラム.dev.projects."$v"は、"$v"という名前のキーを文字通り見つけようとします。代わりに次を試してください。

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 
34
user3899165

あなたも使用できます--argjson jsonを作成するとき。

--arg a v   set variable $a to value <v>;
--argjson a v   set variable $a to JSON value <v>;
7
Sebastien DIAZ

上記のコメントで尋ねられたように、複数の引数を渡す方法があります。もっとエレガントな方法があるかもしれませんが、うまくいきます。

  • 常に必要なすべてのキーが必要な場合は、これを使用できます。
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

  • キーが常に使用されるとは限らない場合は、次のようにすることができます。
jq --arg key $k ' if key != "" then .[$key] else . end'

  • キーが配列を参照することがある場合:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

もちろんこれらを組み合わせることができます!

2
LuWa