如何在Bourne shell中回显多行字符串

时间:2012-05-14 12:18:20

标签: echo sh multiline

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

MY_STRING="
Hello, world! This
Is
A
Multi lined
String."

echo -e $MY_STRING

输出:

Hello, world! This Is A Multi lined String.

我假设echo是罪魁祸首。我怎样才能让它确认换行符?

3 个答案:

答案 0 :(得分:18)

你需要围绕变量插值的双引号。

 echo -e "$MY_STRING"

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

因此,为了明确,shell会在解析命令行时规范化空格。如果你编写一个打印出argv数组的简单C程序,你可以看到这个。

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],换行符和所有字符串。

对于它的价值,也请考虑这里的文件(cat,而不是echo):

cat <<"HERE"
foo
Bar
HERE

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

cat <<HERE
$MY_STRING
HERE

......虽然在这种特殊情况下,它几乎不是你想要的。

答案 1 :(得分:13)

echo是九十年代。 The new (POSIX) kid on the block is printf

 printf '%s\n' "$MY_STRING"

没有-e或SYSV与BSD的回声疯狂,完全控制打印的内容和范围,如C中的转义序列。每个人都请立即开始使用printf,永远不要回头。

答案 2 :(得分:2)

试试这个:

echo  "$MY_STRING"