«Недопустимый числовой литерал» ошибка из jq, пытаясь изменить JSON с переменной - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу передать значения в скрипт bash, который изменит значения в файле json с помощью jq.Я уже некоторое время работаю над этим и не могу преодолеть первый набор ошибок.

Вот мой простой файл json:

{
    "0000000": {
        "pogo": "AJHVUYKJBOIHKNNLNM"
    },
    "7000000": {
        "pogo": "PPPVUYKJBOIHKNNLNM"
    }
}

Вот мой скрипт

#!/bin/bash

#-- pass into script
pgid="${1}"
tpogo="${2}"
file="file.json"

#-- tmp files
tmp_dir="$(mktemp -d -t 'text.XXXXX' || mktemp -d 2>/dev/null)"
tmp_input1="${tmp_dir}/temp_input1.txt"

if [ ! -n "$2" ]; then
   { echo "Check your command as you are missing a variable ..."; echo "Example: script.sh "00000001" "jvkkjbkjbd" ..."; }
   exit 1;
fi

jq -r ".${pgid}.pogo = \"${tpogo}\"" "$file" > "$tmp_input1"
cat "$tmp_input1"
rm -rf "$tmp_dir"

Вот ошибки:

jq: error: Invalid numeric literal at EOF at line 1, column 9 (while parsing '.0000000.') at <top-level>, line 1:
.0000000.pogo = "XXXXXXX"
jq: error: syntax error, unexpected IDENT, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.0000000.pogo = "XXXXXXX"
jq: 2 compile errors

Я испробовал так много вариаций от стека, и большинство из них похоже на то, что я делаю сейчас.

1 Ответ

0 голосов
/ 29 сентября 2018

Что касается немедленного выпуска: .key работает с { "foo": "value" }, но .100 не работает с { "100": "value" };синтаксис, на который вы полагаетесь, - сахар, доступный только для ограниченного набора ключей..["100"] будет работать, но генерирование этого путем расширения переменных оболочки в строки, анализируемые как код, является хрупким (jq не является побочным языком в текущих выпусках, но в языках, которые do поддерживают I/ O операции, такие замены могут быть использованы для инъекционных атак).Чтобы сделать все правильно, выведите свои переменные из кода и используйте их для поиска таким образом, чтобы не полагаться на то, что они содержат.


jqэквивалентно -v var="$value" в awk: --arg var "$value", используется следующим образом:

jq --arg pgid "$pgid" \
   --arg tpogo "$tpogo" \
   '.[$pgid].pogo = $tpogo'

Проверка этого с вашими данными:

json='{"0000000":{"pogo":"AJHVUYKJBOIHKNNLNM"},"7000000":{"pogo":"PPPVUYKJBOIHKNNLNM"}}'
pgid="0000000"
tpogo="XXXXXXX"

jq --arg pgid "$pgid" --arg tpogo "$tpogo" \
   '.[$pgid].pogo = $tpogo' <<<"$json"

... выдает в качестве вывода:

{
  "0000000": {
    "pogo": "XXXXXXX"
  },
  "7000000": {
    "pogo": "PPPVUYKJBOIHKNNLNM"
  }
}
...