这里是我的脚本:
#!/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循环对文件进行迭代充满了问题。请参阅如何逐行(和/或逐字段(读取文件(数据流、变量(?以及为什么你不读带有";对于";
";对于行"-循环在空白处拆分。第一个不需要的空白是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