13

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

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

echo -e $MY_STRING

这输出:

你好世界!这是一个多行字符串。

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

4

3 回答 3

20

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

 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

...尽管在这种特殊情况下,这几乎不是您想要的。

于 2012-05-14T12:20:10.243 回答
14

echo就是这么九十年代。新的(POSIX)孩子是printf.

 printf '%s\n' "$MY_STRING"

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

于 2012-05-14T12:26:00.617 回答
2

尝试这个 :

echo  "$MY_STRING"
于 2012-05-14T12:21:11.113 回答