如何在Bourne shell中打印多行字符串

7 浏览
0 Comments

如何在Bourne shell中打印多行字符串

这个问题已经有答案了:

何时在shell变量周围添加引号?

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

MY_STRING="
Hello, world! This
Is
A
Multi lined
String."
echo -e $MY_STRING

这将输出:

Hello,world!这是一个多行字符串。

我假设是echo的错。那么我该如何让它识别换行符?

admin 更改状态以发布 2023年5月21日
0
0 Comments

echo已经过时了。新时代(POSIX)的宝宝是printf

 printf '%s\n' "$MY_STRING"

不需要-e或SYSV vs BSD echo混乱和完全控制在哪里和如何广泛打印内容,像在C中的转义序列。请大家现在开始使用printf并永不回头。

0
0 Comments

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

 echo -e "$MY_STRING"

这是一种非常普遍的错误。您应该养成总是引用字符串的习惯,除非您特别需要将其分成以空格分隔的令牌或者需要扩展通配符。

因此,为了明确,当Shell解析您的命令行时,它将规范化空白。如果您编写一个简单的C程序,它将打印出它的argv数组,您可以看到这一点。

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 <

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

0