【问题标题】:"Invalid numeric literal" error from jq trying to modify JSON with variable来自 jq 尝试使用变量修改 JSON 的“无效数字文字”错误
【发布时间】:2018-09-28 21:04:18
【问题描述】:

我想将值通过管道传输到 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

我已经尝试了很多来自堆栈的变体,其中大多数看起来都与我现在所做的相似。

【问题讨论】:

标签: json bash jq


【解决方案1】:

至于眼前的问题:.key{ "foo": "value" } 一起使用,但.100{ "100": "value" } 不兼容;您所依赖的语法是糖,仅适用于有限的键子集。 .["100"] 可以工作,但是通过将 shell 变量扩展为解析为代码的字符串来生成它是脆弱的(jq 在当前版本中不是一种副作用语言,而是在 确实 支持的语言中I/O 操作,这种替换可用于注入攻击)。要以正确的方式做事,请从代码中带外传递变量,并以不依赖于它们所包含内容的方式使用它们进行查找。


jq 等价于 awk 的 -v var="$value"--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"
  }
}

【讨论】:

  • 我确实看到了,但当时对我来说没有多大意义,但现在确实如此。另外..是否有必要换行你的命令?
猜你喜欢
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多