![用引号回显换行符](https://linux22.com/image/35419/%E7%94%A8%E5%BC%95%E5%8F%B7%E5%9B%9E%E6%98%BE%E6%8D%A2%E8%A1%8C%E7%AC%A6.png)
为了:
$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
如果变量没有双引号,则会对变量进行分词,hello
并world
成为 的两个不同参数echo
。echo
在参数之间放置一个空格。