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

Hub*_*bro 12 sh multiline echo

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

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

echo -e $MY_STRING
Run Code Online (Sandbox Code Playgroud)

这输出:

Hello, world! This Is A Multi lined String.

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

tri*_*eee 18

您需要围绕变量插值的双引号.

 echo -e "$MY_STRING"
Run Code Online (Sandbox Code Playgroud)

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

所以要明确,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.'
Run Code Online (Sandbox Code Playgroud)

相比之下,引用时,整个字符串都是argv[0]新行和全部.

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

cat <<"HERE"
foo
Bar
HERE
Run Code Online (Sandbox Code Playgroud)

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

cat <<HERE
$MY_STRING
HERE
Run Code Online (Sandbox Code Playgroud)

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


Jen*_*ens 13

echo是九十年代.块上的新(POSIX)小孩是printf.

 printf '%s\n' "$MY_STRING"
Run Code Online (Sandbox Code Playgroud)

没有-e或SYSV vs BSD回应疯狂和完全控制什么被打印在哪里和多宽,逃脱序列像在C中.每个人请开始使用printf现在,永远不要回头.