我正在使用 Bash 在 Linux 机器上运行以下脚本片段。
JSON 文件内容:[ { "id": 123456, "firstName": "John", "lastName": "Smith", "email": "[email protected]" } ]
JSON 文件存储在通过${data[0]}
管道传输到 Bash 脚本的数组中。
重击脚本:
trafficEmployeeId=123456 cat "${data[0]}" | jq --arg employeeId $trafficEmployeeId '.[] | select(.id == $employeeId) | .firstName'
脚本的输出应该是John
.但我什么也没得到。
答案1
即使你trafficEmployeeId
用 a指定了 shell 变量数字它将jq
作为细绳争论。
解决方案是将参数解析为数字和杰克的tonumber
功能。
第二个时刻是data[0]
包含只有一个对象的数组,因此直接使用.[0]
并应用简单的if
运算符条件就足够了。
完整的解决方案:
trafficEmployeeId=123456
echo "${data[0]}" | jq --arg employeeId "$trafficEmployeeId" '.[0]
| if .id == ($employeeId | tonumber) then .firstName else empty end'
输出:
"John"
答案2
代码中的主要问题是您将其作为参数进行cat
调用。${data[0]}
这将导致cat
尝试打开以此作为文件名的文件。这可能就是您所说的“JSON 文件存储在数组中${data[0]}
”的意思,但如果这意味着该文件是字面上地存储在数组中,那么您需要使用printf
将该数据传递给jq
.
当您尝试将数字(在 JSON 文档中)与字符串(表达式$employeeId
中的值jq
)进行比较时,还有一个额外的问题。通过使用--argjson
代替可以轻松解决此问题--arg
。使用--argjson
将jq
假设您创建的变量的值已经进行了适当的 JSON 编码。
你修改后的脚本变成
#!/bin/sh
id=123456
jq --argjson id "$id" '.[] | select(.id == $id).firstName' file.json
或者,如果您想使用以下值${data[0]}
:
#!/bin/bash
# other code here setting data[0] to some JSON document data.
id=123456
printf '%s\n' "${data[0]}" |
jq --argjson id "$id" '.[] | select(.id == $id).firstName'
如果查询来自用户输入或其他外部进程,则仍然使用并将文档中的值转换为字符串以与表达式中进行比较id
可能更安全:--arg
select()
jq --arg id "$id" '.[] | select((.id|tostring) == $id).firstName'