我一直在学习命令行扩展和替换,包括路径名扩展和命令替换。在我的研究中,我遇到了使用双引号控制这些扩展的概念。在尝试这些概念时,我遇到了一种无法解释的行为。
当我使用命令
echo $(cal)
时,输出似乎忽略换行符并显示为单行:
August 2023 Su Mo Tu We Th Fr Sa 1 2 3 4 ...
但是,当我像这样使用双引号时:
echo "$(cal)"
,输出的格式正确,并带有换行符:
August 2023
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
根据我的理解,使用双引号似乎可以在
\n
命令中正确呈现换行符 (echo "$(cal)"
)。
但是,令我困惑的是,当我尝试对其他字符(例如
A\nB
)使用类似方法时,使用命令 echo "A\nB"
,输出不会解释换行符,而是将其显示为文字文本:
A\nB
我发现我需要使用
-e
开关,如下所示:echo -e "A\nB"
,以实现预期的行为:
A
B
有人可以解释为什么这两种情况之间的行为不同吗?为什么
echo "$(cal)"
可以正确解释双引号内的换行符,而 echo "A\nB"
需要 -e
开关才能正确解释?
我感谢您提供的任何见解或澄清。谢谢!
"A\nB"
中没有换行符。 C 样式转义序列不会在单引号或双引号内进行解释。反斜杠可以在双引号字符串中使用,以转义特殊字符,例如 $
,因此它们按字面意思处理,但 \n
没有特殊含义,按字面解释。
要使用 C 样式转义序列创建字符串,请使用
$'string'
。
echo $'A\nB'
将打印
A
B
-e
的 echo
选项告诉 echo
命令在打印时解释字符串内的转义序列。