我想遍历从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
答案 0 :(得分:4)
如果要将路径保存在bash数组中,则需要类似以下内容:
mapfile -t files < <(curl ... | jq '.values[].old.path')
echo "Length is ${#files[@]}"
for file in "${files[@]}"; do
echo "num1 $file"
done
(请参见Correct Bash and shell script variable capitalization)
即使您的问题中存在双引号,也不要使用双引号,请使用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
的解决方法。