Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bash操作jq输出?_Bash_Jq - Fatal编程技术网

如何使用bash操作jq输出?

如何使用bash操作jq输出?,bash,jq,Bash,Jq,我有以下jq代码片段: 我想使用bash循环结果数组中的每个元素,如伪代码所示: #!/bin/bash foreach result print "My name is {name}, I'm {age} years old" print "--" 结果将是: My name is A, I'm 1 years old. --- My name is B, I'm 2 years old. --- My name is C, I'm 3 years old. --- 当然,这是一

我有以下jq代码片段:

我想使用bash循环结果数组中的每个元素,如伪代码所示:

#!/bin/bash
foreach result
  print "My name is {name}, I'm {age} years old"
  print "--"
结果将是:

My name is A, I'm 1 years old.
---
My name is B, I'm 2 years old.
---
My name is C, I'm 3 years old.
---
当然,这是一个简单的例子,只是为了说明我的目标是分别操作jq结果中的每个数组

关于如何将伪代码写入有效的bash语句,有什么建议吗?

保存json:

{
    "Names": [
        { "Name": "A", "Age": "1" },
        { "Name": "B", "Age": "2" },
        { "Name": "C", "Age": "3" }
    ]
}
作为/tmp/input.txt,我可以运行:

</tmp/input.txt jq --raw-output 'foreach .Names[] as $name ([];[];$name | .Name, .Age )' \
| while read -r name && read -r age; do 
      printf "My name is %s, I'm %d years old.\n" "$name" "$age"; 
      printf -- "--\n";
done
很遗憾,最好是编写一个完整的解析器,将像
“\”
这样的字符串考虑在内

</tmp/input2.txt sed 's/^\[//;s/\]$//;' \
| while IFS=, read name age; do 
       name=${name%\"}; 
       name=${name#\"};   
       age=${age%\"};
       age=${age#\"};
       printf "My name is %s, I'm %d years old.\n" "$name" "$age";
       printf -- "--\n";
done

我编写了一个简单的脚本来实现您所需要的:

我的Json文件
test.Json
与您的代码片段类似:

{
    "Names": [
        { "Name": "A", "Age": "1" },
        { "Name": "B", "Age": "2" },
        { "Name": "C", "Age": "3" }
    ]
}
我的剧本:

#!/bin/bash
for i in $(cat test.json | jq -r '.Names[] | @base64'); do
    _jq() {
     echo ${i} | base64 --decode | jq -r ${1}
    }
   echo "My Name is $(_jq '.Name'), I'm $(_jq '.Age') years old"
done

请注意,
foreach.Names[]作为$name([];[];$name |.name.Age)
可简化为:

.Names[] | ( .Name, .Age )
甚至在这种特殊情况下:

.Names[][]
或就此而言:

.[][][]

然而,重要的一点是,
foreach
不需要实现简单的迭代。

我将您的答案标记为有效答案,因为您使用了与我在代码段中使用的相同的筛选器。非常感谢您的详细解释!您好,我没有将其标记为已接受的答案,因为所使用的筛选器与我在中使用的筛选器不同我的第一个问题,但我很高兴知道我能达到同样的结果。非常感谢!
.[][][]