我想遍历从curl响应收到的以下数组,并在新行上打印所有“ path”属性的值,但是每次都得到不想要的结果(可能是我不知道该怎么做)
{
"values": [
{
"old": {
"path": "textfile.txt"
},
"size":1
},
{
"old": {
"path": "text1file.txt"
},
"size":1
}
]
}
下面是我的bash脚本,它仅返回第一个值,当我尝试获取长度时,它总是返回1而不是2
1) FILES=$(curl "https://url" | jq '(.values[].old.path)')
2) echo "$FILES"
3) echo "length is : ${#FILES[@]}"
4) for i in "${FILES[@]}"; do
5) echo "num1 ${i}"
6) done
第2行收到的响应如下:
"textfile.txt"
"text1file.txt"
第3行收到的回复:
length is: 1
第5行的预期响应为:
num1 "textfile.txt"
num1 "text1file.txt"
但是相反它给出:
num1 "textfile.txt"
"text1file.txt"
PS:我正在bitbucket管道中执行上述脚本以实现CD流程
有谁知道上面的for循环有什么问题吗?
编辑:我也尝试下面的脚本,它仍然只提供第一个值
curl -H 'Content-Type:application/json' https://url >> myfilenames.json
for i in $(jq -r '.values[].old.path' myfilenames.json); do
echo "${i}"
done
如果要将路径保存在bash数组中,则需要类似以下内容:
mapfile -t files < <(curl ... | jq '.values[].old.path')
echo "Length is ${#files[@]}"
for file in "${files[@]}"; do
echo "num1 $file"
done
(请参阅正确的Bash和Shell脚本变量大写)
以防万一即使您的问题中出现双引号,也可以使用jq -r
。
如果您不希望引号和路径中可能包含换行符(并且已jq
安装开发版本):
mapfile -d '' -t files < <(curl ... | jq -0 '.values[].old.path')
该-0
选项尚未正式发布。因此此版本将更加有用:
mapfile -d '' -t files < <(curl ... | jq -j '.values[] | "\(.old.path)\u0000"')
如果您使用的版本bash
早于4.4,请参见Bash FAQ 005,以了解使用read
循环而不是的解决方法mapfile
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句