linux - 相同版本的 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
解决方案
根据@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 不再拆分此处字符串的扩展。