Как передать переменную в JQ выбор / содержит запрос
Я пытаюсь передать две переменные в 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"
1 ответ
Во-первых, показанный ввод не является ни действительным JSON, ни допустимым потоком документов JSON. Так как вы использовали ..|objects
Я предполагаю, что ваше намерение состояло в том, чтобы входные данные были массивом.
Во-вторых, опция -n означает: не читать автоматически STDIN или указанный файл. Так как вы использовали cat
Я брошу это.
В-третьих, вы использовали $TESTDATE и $test1 без указания значений выборки. Я собираюсь использовать переменные и значения, показанные ниже.
В-четвертых, обычно лучше передавать значения параметров, используя параметр --arg или --argjson, как вы сделали для $TESTDATE, но не для $test1.
В-пятых, это незначительный момент, но я собираюсь потерять 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
вместо.