关于sh:如何在Bourne shell中回显多行字符串

How to echo multi lined strings in a Bourne shell

本问题已经有最佳答案,请猛点这里访问。

我想创建一些脚本来填充一些模板并将它们插入到我的项目文件夹中。我想用一个shell脚本来完成这个任务,模板非常小,所以我想将它们嵌入shell脚本中。问题是,echo似乎忽略了字符串中的换行符。或者字符串不包含要以其开头的换行符。下面是一个例子:

1
2
3
4
5
6
7
8
MY_STRING="
Hello, world! This
Is
A
Multi lined
String."

echo -e $MY_STRING

此输出:

1
Hello, world! This Is A Multi lined String.

我假设埃多克斯1〔0〕是这里的罪魁祸首。我如何才能确认换行?


在变量插值周围需要双引号。

1
 echo -e"$MY_STRING"

这是一个非常常见的错误。您应该养成总是引用字符串的习惯,除非您特别需要拆分成空格分隔的标记或扩展通配符。

所以为了明确起见,shell将在解析命令行时规范化空白。如果编写一个简单的C程序,打印出它的argv数组,就可以看到这一点。

1
2
3
4
5
6
7
8
argv[0]='Hello,'
argv[1]='world!'
argv[2]='This'
argv[3]='Is'
argv[4]='A'
argv[5]='Multi'
argv[6]='lined'
argv[7]='String.'

相比之下,与引用相比,整个字符串位于argv[0]、换行符和all中。

就其价值而言,还应考虑以下文件(使用cat,而不是echo):

1
2
3
4
cat <<"HERE"
foo
Bar
HERE

还可以在此处文档中插入变量。

1
2
3
cat <<HERE
$MY_STRING
HERE

…尽管在这种情况下,这几乎不是你想要的。


echo是90年代的。新来的(posix)孩子是printf

1
2
 printf '%s
'"$MY_STRING"

没有-e或sysv与bsd的对比,回声疯狂,完全控制了在哪里和多宽范围内打印的内容,像c中的转义序列。现在请大家开始使用printf,不要回头看。


试试这个:

1
echo "$MY_STRING"