[英]“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.