如何将变量传递给 JQ select/contains 查询

How to pass a variable into JQ select/contains query

我正在尝试将两个变量传递到 jq 查询中。

我的JSON

 {
 "AlbumTitle": "Name Of Album",
 "AlbumLink": "/album/link/id/1/album-name/",
 "ArtistName": "Artist Name",
 "Date": "September 14, 2018"
 },
 {
 "AlbumTitle": "Name Of Album",
 "AlbumLink": "/album/link/id/2/album-name/",
 "ArtistName": "Artist Name",
 "Date": "September 13, 2018"
 }

我有两个变量作为日期和艺术家姓名,我正在尝试根据变量拉回 ArtistLink。

我用的是下面的JQ线

 cat test.json | jq -n -r --arg TESTDATE "$TESTDATE" '.. | objects | {select(.Date == '"$TESTDATE"')} | select(.ArtistName | contains('"$test1"')) | .AlbumLink'

我遇到了错误

 "jq: error: syntax error, unexpected '(', expecting '}'      (Unix shell quoting issues?) at <top-level>, line 1:
 .. | objects | {select(.Date == September 13, 2018)} | select(.ArtistName | contains(Artist)) | .AlbumLink                      
 jq: 1 compile error"

首先,显示的输入既不是有效的 JSON 也不是有效的 JSON 文档流。既然你已经 使用 ..|objects 我假设你的意图是输入是一个数组。

其次,-n选项表示:不自动读取STDIN或指定文件。既然你已经 用过cat,弃之

第三,你在没有给出样本值的情况下使用了$TESTDATE和$test1。我要用 下面显示的变量和值。

第四,一般最好使用--arg或--argjson选项传入参数值, 正如您为 $TESTDATE 而不是 $test1 所做的那样。

第五,这是一个小问题,但我要失去cat:见Useless use of cat?

把它们放在一起,我们可以写成:

testdate="September 13, 2018"
testname="Artist Name"

< test.json jq -r --arg testdate "$testdate" --arg testname "$testname" '
    .[]
    | select((.Date == $testdate) and (.ArtistName | contains($testname)))
    | .AlbumLink '
然而,

contains 是一个有趣的野兽,通常我建议使用 index