for循环仅返回bash脚本中的第一个数组元素

时间:2020-08-24 16:18:51

标签: linux bash

我想遍历从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

1 个答案:

答案 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的解决方法。

相关问题