簡體   English   中英

jq嘗試使用變量修改JSON的“無效數字文字”錯誤

[英]“Invalid numeric literal” error from jq trying to modify JSON with variable

我想將值傳遞到bash腳本中,該腳本將使用jq更改json文件中的值。 我已經為此工作了一段時間,無法克服第一組錯誤。

這是我簡單的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

我從堆棧中嘗試了很多變體,其中大多數看起來與我現在正在做的類似。

至於眼前的問題: .key{ "foo": "value" } ,但是.100{ "100": "value" } 您所依賴的語法是糖,僅適用於鍵的有限子集。 .["100"]會的工作,但生成的擴展shell變量用到解析為代碼串是脆弱的( jq是不是副作用的語言作為當前版本的,但在支持I / O操作語言,例如可以利用替代手段進行注入攻擊)。 要以正確的方式進行操作,請將變量從代碼中帶外傳遞,並以不依賴於變量內容的方式將其用於查找。


相當於awk的-v var="$value"jq--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"
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM