Rya*_*ger 2 linux bash json jq
我正在尝试编写一个脚本来对 json 对象数组进行一些处理。源 json 的简化版本如下所示。请注意第二个对象中转义的双引号。
[
{
"id": "1a-2b",
"name": "my job name",
"description": "my job description"
},
{
"id": "3c-4d",
"name": "my \"quoted\" job name",
"description": "my \"quoted\" job description"
}
]
Run Code Online (Sandbox Code Playgroud)
我的脚本当前尝试使用我在搜索中其他地方找到的“读取时”惯用法来迭代源代码,如下所示。
while read job; do
# fetch individual values into variables
jobname=`echo $job | jq -r '.name'`
# do processing on the individual values
echo $jobname
done < <(cat jobs | jq -c '.[]')
Run Code Online (Sandbox Code Playgroud)
问题似乎是转义的引号在紧凑输出以及随后的 $job 变量中未转义。因此,当我在循环内使用 jq 重新处理单个对象时,每个具有引用值的对象都会出现 jq 解析错误。
我目前正在使用 jq 1.4,并且一直在尝试 tojson/fromjson/@sh/tostring 的各种组合,但尚未找到正确的组合。我不反对迁移到 jq 1.5,如果它有一个功能可以让这变得更容易。如果有更聪明的方法来做我想做的事情,我也不会接受“边读边读”的习惯。
无需jq再次调用每个数组元素,只需通过第一个调用来获取循环的名称即可。
while read -r job; do
echo "$job"
done < <(jq -c '.[].name' < jobs)
Run Code Online (Sandbox Code Playgroud)
(并read -r按照 Etan 的建议使用)。
如果您需要多个变量,请尝试(例如)
while read -r id
read -r job; do
echo "$id: $job"
done < <(jq -c '.[]|.id,.name' < jobs)
Run Code Online (Sandbox Code Playgroud)