首页 > 解决方案 > 相同版本的 jq 在 Ubuntu 16 和 Ubuntu 18 上的行为不同

问题描述

我有一个带有 JQ 依赖项(版本 jq-1.5-1-a5b5cbe)的 bash 脚本,它在 Ubuntu 18.04.2 LTS(bash 版本 4.4.19(1)-release)上按需要运行,但它在 Ubuntu 16.04 上的行为不同。 3 LTS(bash 版本 4.3.48(1)-release)。

while read i;do
  echo ${i}
  echo "...."
  done<<<$(jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]')

我希望每个对象都打印在单独的行上,就像我在 Ubuntu 18 上运行的下面那个一样,

{"name":"alpha"}
....
{"name":"beta"}
....
{"name":"gama"}
....
{"name":"delta"}
....

但是在 Ubuntu 16 上,我得到了这个输出,

{"name":"alpha"} {"name":"beta"} {"name":"gama"} {"name":"delta"}
....

当我尝试运行以下脚本时,它在两个单独的行上的每个对象都完美运行。但是由于 While 循环在子 shell 中运行,如果在其中执行任何操作,我将无法保留变量的状态。所以这是不希望的,因为我想做一些操作并保留变量的状态。

jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]' |while read i;do
    echo ${i}
    echo "...."
done

标签: linuxbashshellubuntujq

解决方案


根据@CharlesDuffy 的建议进行了更新。

while IFS= read -r line; do
  echo "$line"
  echo "..."
done <<< "$(jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]')"

原来的

这与Bash 中的分词有关。您必须""明确添加以避免分词。

while read i; do
  echo ${i}
  echo "...."
  done <<< "$(jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]')"

<<<Bash在 4.4 beta 中更改了此处的字符串拆分

本文档详细介绍了此版本 bash-4.4-beta 与先前版本 bash-4.4-alpha 之间的更改。

...

z。正如文档一直所说的那样,Bash 不再拆分此处字符串的扩展。


推荐阅读