【问题标题】:Same version of jq behaves differently on Ubuntu 16 and Ubuntu 18相同版本的 jq 在 Ubuntu 16 和 Ubuntu 18 上的行为不同
【发布时间】:2020-02-02 16:22:06
【问题描述】:

我有一个带有 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

【问题讨论】:

  • 考虑养成通过shellcheck.net 运行代码的习惯,并在此处提问之前修复所有内容;明确包含引用不足的问题。
  • 另外,如果您只运行 jq 而没有任何 while read 循环,您会看到两个版本之间的输出相同,因此您会知道问题在于 bash 已更改,而不是jq 变了。

标签: linux bash shell ubuntu jq


【解决方案1】:

根据@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 changed here-string &lt;&lt;&lt; splitting in 4.4 beta

本文档详细介绍了此版本 bash-4.4-beta 和 以前的版本,bash-4.4-alpha。

...

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

【讨论】:

  • “固定”代码仍然可以使用一些工作。请参阅BashPitfalls #14 回复:为什么echo ${i} 坏了(需要是echo "$i",甚至更好,printf '%s\n' "$i");并查看 BashFAQ #1 以了解使用 while read 循环的最佳实践(应为 while IFS= read -r i; do 以避免使用反斜杠或静默删除尾随空格)。
  • 感谢@Simba,这里的字符串更改信息,它工作得很好。
  • @CharlesDuffy,我有一个不同的脚本,这只是一个用于理解此处字符串行为的虚拟脚本。顺便说一句,感谢您告诉我们 shellcheck.net 真棒
猜你喜欢
  • 1970-01-01
  • 2019-08-23
  • 2016-03-11
  • 2020-01-04
  • 2016-06-22
  • 2014-07-27
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多