命令行回显中双引号换行解释的混乱

问题描述 投票:0回答:1

我一直在学习命令行扩展和替换,包括路径名扩展和命令替换。在我的研究中,我遇到了使用双引号控制这些扩展的概念。在尝试这些概念时,我遇到了一种无法解释的行为。

当我使用命令

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
开关才能正确解释?

我感谢您提供的任何见解或澄清。谢谢!

linux command-line echo double-quotes
1个回答
0
投票

"A\nB"
中没有换行符。 C 样式转义序列不会在单引号或双引号内进行解释。反斜杠可以在双引号字符串中使用,以转义特殊字符,例如
$
,因此它们按字面意思处理,但
\n
没有特殊含义,按字面解释。

要使用 C 样式转义序列创建字符串,请使用

$'string'

echo $'A\nB'

将打印

A
B

-e
echo
选项告诉
echo
命令在打印时解释字符串内的转义序列。

© www.soinside.com 2019 - 2024. All rights reserved.