用引号回显换行符

用引号回显换行符

为了:

$hello="hello
> world"

为什么echo不打印换行符:

echo -e $hello

但如果我加$hello引号就可以了。

$ echo "$hello"
hello
world

这是因为 ANSI-C 引用吗?不应该echo -e解释我输入的换行符吗?

答案1

bash手册页中,这描述了如何根据变量的内容完成分词IFS

分词

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。

shell 将 的每个字符IFS视为分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词。如果IFS未设置,或者其值恰好是<space><tab><newline>默认值,则忽略先前扩展结果的开头和结尾处的<space><tab>、 和序列,并且不在开头或结尾处的任何 IFS 字符序列用于分隔单词<newline>。如果IFS具有默认值以外的值,则只要空白字符位于IFS(一个IFS空白字符) 的值中,单词开头和结尾的空白字符 space 和 tab 序列就会被忽略。IFS其中的任何非空白字符IFS以及任何相邻的 IFS 空白字符都会分隔字段。空白字符序列IFS也被视为分隔符。如果 的值为IFS空,则不会发生分词。

保留显式空参数(""或)。''由于扩展没有值的参数而产生的不带引号的隐式空参数将被删除。如果没有值的参数在双引号内展开,则会产生空参数并被保留。

请注意,如果没有发生扩展,则不会执行拆分。

bash如果变量没有双引号,则会对变量进行分词,helloworld成为 的两个不同参数echoecho在参数之间放置一个空格。

相关内容