抨击heredoc的损坏回声



这里是我的脚本:

#!/bin/bash
read -r -d '' content << VAR
one
two
three
{"foo":"bar"}
{cron":"0 1 * * *"}
VAR
for line in $content; do
echo "==| ${line}"
done

如果没有线路{cron":"0 1 * * *"},它可以完美地工作并产生正确的输出:

==| one
==| two
==| three
==| {"foo":"bar"}

但使用行{cron":"0 1 * * *"},它打印损坏的输出:

==| one
==| two
==| three
==| {"foo":"bar"}
==| {cron":"0
==| 1
==| LICENSE
==| README.md
==| ed
==| y.sh
==| LICENSE
==| README.md
==| ed
==| y.sh
==| *"}

我正在macOS上运行此脚本。

编写此脚本的正确方法是while循环。

while IFS= read -r line; do
printf '%sn' "$line"
done <<'EOF'
one
two
three
{"foo":"bar"}
{cron":"0 1 * * *"}
EOF

至少,您不需要read来设置content:的值

content='one
two
three
{"foo":"bar"}
{cron":"0 1 * * *"}'

但是使用CCD_ 7循环对文件进行迭代充满了问题。请参阅如何逐行(和/或逐字段(读取文件(数据流、变量(?以及为什么你不读带有";对于";

编辑:正确的方法是使用while循环而不是for循环。请参阅其他答案。

";对于行"-循环在空白处拆分。第一个不需要的空白是cron行中";0";以及";1〃;。";垃圾;输出中有脚本的命令行参数吗?至少我的测试看起来是这样的。

为了避免在空白处进行拆分,请使用变量IFS。将其设置为";换行符";。

IFS=$'n'
read -r -d '' content << VAR
one
two
three
{"foo":"bar"}
{"cron":"0 1 * * *"}
VAR
for line in $content; do
echo "==| ${line}"
done

相关内容

  • 没有找到相关文章

最新更新