&引用;无效的数字文字“;jq试图用变量修改JSON时出错
我希望将值导入bash脚本,该脚本将使用jq更改json文件中的值。我已经在这方面工作了一段时间,但我无法克服第一组错误 以下是我的简单json文件:&引用;无效的数字文字“;jq试图用变量修改JSON时出错,json,bash,jq,Json,Bash,Jq,我希望将值导入bash脚本,该脚本将使用jq更改json文件中的值。我已经在这方面工作了一段时间,但我无法克服第一组错误 以下是我的简单json文件: { "0000000": { "pogo": "AJHVUYKJBOIHKNNLNM" }, "7000000": { "pogo": "PPPVUYKJBOIHKNNLNM" } } 这是我的剧本 #!/bin/bash #-- pass into script pgid="$
{
"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
jq:error:第1行第9列的EOF处的数值文字无效(在分析第1行的“.0000000.”时):
.0000000.pogo=“XXXXXXX”
jq:error:syntax error,意外的标识符,在第1行处应为$end(Unix shell引用问题?):
.0000000.pogo=“XXXXXXX”
jq:2个编译错误
我已经尝试了许多不同于stack的变体,其中大多数看起来与我现在所做的相似。至于眼前的问题:
.key
与{foo:“value”}
,但是.100
与{100:“value”}
不起作用;您所依赖的语法是sugar,仅适用于有限的密钥子集<代码>[“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"
至于眼前的问题:
.key
与{foo:“value”}
一起使用,但是.100
与{100:“value”}
不一起使用;您所依赖的语法是sugar,仅适用于有限的密钥子集<代码>[“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"
这部分内容是重复的。@Barmar我这样做了。当然感谢你的帮助。这部分内容是重复的。@Barmar我这样做了,mate。当然感谢你的帮助。我确实看到了这一点,但当时对我来说没有多大意义,但现在有了意义。而且有必要打断你的命令吗?我确实看到了,但当时我觉得没什么意义,但现在有了。而且您的命令是否需要换行?