什么是大引号?我可以在代码中使用它们吗?

jes*_*e_b 8 special-characters shell-script quoting

不知何故,大引号进入了我的代码,我得到了意想不到的行为

\n
#!/bin/sh\n\nif [ foo = \xe2\x80\x98foo\xe2\x80\x99 ]; then\n   echo yes\nelse\n   echo no\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

我希望这会回显 yes,但实际上却回显 no。

\n

jes*_*e_b 22

弯引号或 \xe2\x80\x9csmartquotes\xe2\x80\x9d 用于排版,“直引号”通常会被各种文字处理程序自动更改为弯引号。它们有时被称为“智能引号”,因为它们在某种程度上智能地确定引用文本的方向并向其卷曲。

\n

以下是各种报价的表格:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n
特点描述视窗/Unix苹果系统超文本标记语言
\'直接单引号\'\'\'
直双引号"""
\xe2\x80\x98打开单引号alt+0145option+]‘
\xe2\x80\x99结束单引号alt+0146option+ shift+]’
\xe2\x80\x9c打开双引号alt+0147option+[“
\xe2\x80\x9d结束双引号alt+0148option+ shift+[”
\n
\n

然而,在编程语言中,这些引号是不可互换的。直引号通常是在语言中执行特定功能的特殊字符,而外观相似的弯引号不被认为是特殊的。相反,它们可能会产生错误,或者可能被视为与字母有点相似的普通字符。

\n

因此,在这个问题的代码示例中,大引号被视为它们的文字字符,而不仅仅是 shell 转义字符,因此\'foo\'不匹配\'\xe2\x80\x98foo\xe2\x80\x99\'

\n

为了防止出现此问题,您应该仅在专为代码编辑而设计的程序中编辑代码,并小心从任何文字处理应用程序(LibreOffice Word、写字板、电子邮件等)、PDF 文档或在线代码源复制代码。

\n

弯引号和直引号之间的视觉区别可能很小,但通常可以区分。弯引号通常显示为倾斜的,或者类似于微型 6 或 9,具体取决于字体。

\n

类似的程序od也可用于区分常规 ASCII 直引号和 Unicode 弯引号。例如,以下文本文件的\xe2\x80\x9cfoo\xe2\x80\x9d一行上带有大引号,"foo"另一行上带有直引号,并且在 UTF-8 语言环境中,输出为od -c显示大引号占用多个字节,而直引号则占用多个字节只取一个:

\n
mac$ od -c test.txt\n0000000    \xe2\x80\x9c  **  **   f   o   o   \xe2\x80\x9d  **  **  \\n   "   f   o   o   "  \\n\n0000020\n\ngnu$ od -c test.txt\n0000000 342 200 234   f   o   o 342 200 235  \\n   "   f   o   o   "  \\n\n0000020\n
Run Code Online (Sandbox Code Playgroud)\n

(在上图中,macOS 在od第一个位置显示完整字符,并用 标记字符的其余字节**,而在下图中,GNUod以八进制显示字符中所有字节的值。)

\n

  • 大引号是字符,智能引号是编辑器功能,可以自动用大引号替换直引号。 (13认同)
  • 从在线源复制时也要小心,我在在线代码示例中看到过不少带有大引号的内容。 (12认同)