jq 尝试使用变量修改 JSON 时出现“无效数字文字”错误

2023-11-29

我想将值通过管道传输到 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(使用前将#替换为@)

jq 尝试使用变量修改 JSON 时出现“无效数字文字”错误 的相关文章

随机推荐

  • Dart 中的插入符号有什么作用

    我正在查看一些 Flutter 项目 我注意到以下代码 override int get hashCode gt todos hashCode isLoading hashCode 这个 符号在这里做什么 这行代码是在Flutter项目的A
  • 如何根据 C++ 标准访问对象表示?

    如何访问对象表示 为了回答这个问题 我将其分为两个问题 1 如何获得对象表示的指针 根据标准 我看不到任何方法来获取指向对象表示 人们经常建议这样实现 some type obj const char rep reinterpret cas
  • System.getProperty("java.class.path") 不显示“WEB-INF/lib”和包含的 jar

    String CompilePath abc java JavaCompiler compiler ToolProvider getSystemJavaCompiler String classpath System getProperty
  • 在地图视图中显示动态注释图钉

    我正在开发一个应用程序 它使用MKMapView 我在其中显示了多个注释 现在我想显示引脚的自定义注释图像 我为 MapViewAnnotation 制作了自定义类 import
  • C# 高级排列场景

    我试图弄清楚如何在给定以下信息的情况下找到所有组合 我从一个 JSON 数据集开始 var choices 1 Q 100 R 150 W 250 T 30 2 Q 90 R 130 W 225 T 28 3 Q 80 R 110 W 21
  • 从谷歌驱动器中的特定文件夹获取文件列表

    我正在使用 Google Play 服务 SDK 并尝试了Demos来自开发者网站 有没有办法从特定文件夹获取 下载 所有文件 任何指针都会有很大帮助 整个示例代码似乎并不完整 这是执行类似操作的方法的 await 版本 必须在非 ui 线
  • 如何分组为数组映射?

    Can a groupingBy对流的操作会生成一个映射 其中的值是arrays而不是列表或其他集合类型 例如 我有一堂课Thing 事物有主人 所以Thing has a getOwnerId方法 在事物流中 我想按所有者 ID 对事物进
  • 使用 Flask 框架从 html 播放波形文件?

    这是我的 run py 代码 from flask import app flask Flask name app config from object config app route methods GET POST def new t
  • 以角度形式修补值

    我正在使用 Angular 6 制作一个应用程序 其中我使用的是 Angular 动态形式 截至创建表单并提交 我已完成所有工作 您可以看到工作情况堆栈闪电战 https stackblitz com edit angular x4a5b6
  • WPF OpenFileDialog 与 MVVM 模式? [复制]

    这个问题在这里已经有答案了 我刚刚开始学习 WPF 的 MVVM 模式 我撞墙了 当你需要展示时你会做什么OpenFileDialog 这是我尝试使用它的示例用户界面 单击浏览按钮时 会出现OpenFileDialog应该显示 当用户从文件
  • SKAction playSoundFileNamed 停止背景音乐

    我想要我的SpriteKit游戏不中断用户收听的背景音乐 Music app 或广播应用程序 一切都很顺利 直到执行到这一行 sSharedShootSoundAction SKAction playSoundFileNamed plane
  • 在 mysql php 搜索中突出显示搜索文本

    嗨 这是我的脚本 它可以很好地搜索我的数据库 我有一个表单 html用户在搜索框中输入关键字
  • PHP 表单提交后重定向到新页面

    我有一个表单 在提交表单后将用户重定向到 page1 php 我想要做的是在提交表单后将用户重定向到 page2 php 但我需要确保已发送 POST 请求 例子
  • 如何创建具有标志修改的 QMessageBox 子类?

    我试图使 QMessageBox 中的文本可选择 我发现如果我修改 QMessageBox 上的 setTextInteractionFlags 就可以解决问题 然而 当我尝试这样做时 我的 PyQt 或更具体地说 PySide 抱怨该属性
  • 反应“渲染后”代码?

    我有一个应用程序 我需要动态设置元素的高度 比如说 应用程序内容 它获取应用程序 chrome 的高度并减去它 然后设置 app content 的高度以 100 适合这些约束 对于普通的 JS jQuery 或 Backbone 视图来说
  • 在经典 ASP 中从 ADODB 调用参数化 Oracle 查询

    我目前正在开发一个与 Oracle 数据库交互的经典 ASP 项目 我正在尝试找到一种安全调用 Oracle PL SQL 脚本并使用 ADO 传递参数的方法 当前的解决方案使用嵌入变量手动构建 SQL 脚本 如下所示 strSQL SEL
  • 布尔类型

    在代码审查期间 我发现 C 代码的许多地方如下所示 if IsValid return true else return false 甚至 更好 return IsValid true false 我一直想知道为什么不直接写这样的代码 re
  • SBT:遍历项目依赖图

    我有一个多模块 Web 项目 其依赖关系图与此类似 WAR project A1 A2 A3 B1 B2 B22 B3 这就是战争项目所依赖的A1这又取决于A2 and A3等等 现在 在打包 war 项目之前 我想将一些 Web 资源从其
  • C++ 结构体排序

    我有一个自定义结构向量 每次都需要根据不同的标准进行排序 实现运算符 但我希望每次调用 C 标准排序时都能够指定排序标准 怎么做 请注意 运行时间最好高效 Thanks 您可以使用第三个参数定义每次运行排序算法时使用的比较函数 templa
  • jq 尝试使用变量修改 JSON 时出现“无效数字文字”错误

    我想将值通过管道传输到 bash 脚本中 该脚本将使用 jq 更改 json 文件中的值 我已经为此工作了一段时间 但无法克服第一组错误 这是我的简单 json 文件 0000000 pogo AJHVUYKJBOIHKNNLNM 7000