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

nz_pree:

我想遍历从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

遍历2个数组仅循环第一个元素

在bash中遍历2个数组-仅遍历每个数组中的第一个值

第一个数组元素在循环 C++ 中丢失

为什么我的脚本仅访问数组中的第一个元素?

搜索栏仅返回数据数组中的第一个元素

在def中返回数组的第一个元素

Vue:Filter返回一个数组,如何获取第一个元素

Puppet 4.10中的自定义函数仅返回哈希中的第一个数组项

MongoDB:进行投影以仅返回嵌套到另一个对象的另一个数组中嵌套的数组的第一个元素

preg_match_all仅返回索引为0的第一个数组,而不返回索引为1的第一个数组

如何停止循环以仅获取第一个数组的内容?

从数组中删除第一个元素并返回减去第一个元素的数组

使用不带索引的数组名称将获取Bash中的第一个数组元素,好吗?

自动用元素列表循环填充数组,仅设置第一个元素

映射Javascript中数组数组中每个数组的第一个元素

Bash shell 脚本从多行变量返回第一个数字/整数?

PHP:循环获取第一个数组

foreach中的数组仅显示第一个数组

使用If语句的For循环仅返回第一个元素

'simplexml'php到mysql数据库循环仅返回第一个元素

脚本IF ELSE仅适用于php中的第一个数据

从列表中创建一个数组,其中数组的第一个元素是列表中的第一个元素

Foreach循环仅返回第一个结果

显示第一个数组元素 - ReactJS

循环多维数组,仅获取第一个元素

Foreach循环仅返回多维数组PHP上的第一个索引

循环遍历 Div 中的元素仅获取第一个元素

如何仅解析android中json对象中的第一个数组?

Xpath通配符仅返回第一个元素