混淆使用双引号的命令行回显中的换行符解释

Confusion about Newline Interpretation in Command Line Echo with Double Quotes

提问人:Ahmed Waleed 提问时间:8/11/2023 更新时间:8/11/2023 访问量:19

问:

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

当我使用命令时,输出似乎忽略了换行符并显示为单行: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

根据我的理解,使用双引号似乎可以在命令中正确呈现换行符 ()。\necho "$(cal)"

但是,让我感到困惑的是,当我尝试使用其他字符的类似方法时,例如 ,使用命令 ,输出不会解释换行符,而是将其显示为文字文本:A\nBecho "A\nB"

A\nB

我发现我需要使用开关,如下所示: ,以实现预期的行为:-eecho -e "A\nB"

A
B

有人可以解释为什么这两种情况之间的行为不同吗?为什么正确解释双引号内的换行符,而需要切换才能正确解释?echo "$(cal)"echo "A\nB"-e

我很感激你能提供的任何见解或澄清。谢谢!

Linux 命令行 回显 双引号

评论


答:

1赞 Barmar 8/11/2023 #1

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

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

echo $'A\nB'

将打印

A
B

用于指示命令在打印时解释字符串内的转义序列的选项。-eechoecho

评论

0赞 Ahmed Waleed 8/11/2023
非常感谢您展示这一事实。但是我还是不知道为什么双引号解决了命令echo “$(cal)”中的问题,如果$(cal)会返回一堆英文字母和中间的一些'\n'转义序列,那么就等价于echo “A\nB”
1赞 Barmar 8/11/2023
双引号可防止命令输出中的单词拆分。拆分单词将所有空格序列转换为单个空格,因此换行符将转换为空格。
0赞 Ahmed Waleed 8/11/2023
确切地说,双引号将空格、制表符和换行符视为文本的一部分,而不是分隔符或分隔符。但是我想确定 $(cal) 是否返回其结果,例如“xyz \n abc \t”?
0赞 Barmar 8/11/2023
它不会回来.它返回实际的换行符,就像您正常运行命令时看到的那样。引号可以防止它们被空格替换。\n
0赞 Barmar 8/11/2023
似乎让你感到困惑的是,你认为是一个换行符。它不是换行符,而是由某些编程语言或命令解释的转义序列,并用换行符替换。\n