Почему использование $ s в «2000» в jq --argjson отличается от использования «2000» в коде JQ? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь написать скрипт bash, который анализирует файл JSON приза nobel.Первый аргумент - это год, а второй - категория.

set -- 2000 physics  # set $1 to 2000 and $2 to physics
jq -cr --argjson y "$1" --arg c "$2" \
  '.prizes[] | select(.category == $c)| select(.year == $y )' <<'EOF'
{"prizes": [
  {"category": "math", "year": "1999"},
  {"category": "physics", "year": "2000"}]}
EOF

... не имеет выходных данных, тогда как он должен вывести одну строку с

{"category":"physics","year":"2000"}

Однако, только из категории, полученной из переменной, она работает:

set -- physics  # set $1 to physics
jq -cr --arg c "$1" \
  '.prizes[] | select(.category == $c)| select(.year == "2000" )' <<'EOF'
{"prizes": [
  {"category": "math", "year": "1999"},
  {"category": "physics", "year": "2000"}]}
EOF

... правильно выдает строку, указанную выше.

Таким образом, только числовой год имеет проблемы с прохождением -- какова бы ни была проблема, она не относится к категории.

1 Ответ

0 голосов
/ 14 апреля 2019

Очевидно, что в файле JSON год является строкой, поэтому вы должны использовать --arg y $YEAR или --arg y "$YEAR".

Если для переменной оболочки YEAR установлено значение, например 2000, --argjson y "$YEAR" приводит к установке переменной jq $ y в целое число:

$ jq -n --argjson y "2000" '$y|type'
"number"
...