我想将值通过管道传输到 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" }
, but .100
不适用于{ "100": "value" }
;您所依赖的语法是糖,仅适用于有限的键子集。.["100"]
可以,但是通过将 shell 变量扩展为解析为代码的字符串来生成它是脆弱的(jq
截至当前版本,不是一种副作用语言,但在以下语言中do支持 I/O 操作,此类替换可用于注入攻击)。要以正确的方式做事,请从代码中传递带外变量,并以不依赖于它们包含的内容的方式使用它们进行查找。
The jq
相当于awk的-v var="$value"
is --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"
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)