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

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

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

#!/bin/sh

if [ foo = ‘foo’ ]; then
   echo yes
else
   echo no
fi

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

答案1

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

以下是各种报价的表格:

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

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

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

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

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

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

mac$ od -c test.txt
0000000    “  **  **   f   o   o   ”  **  **  \n   "   f   o   o   "  \n
0000020

gnu$ od -c test.txt
0000000 342 200 234   f   o   o 342 200 235  \n   "   f   o   o   "  \n
0000020

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

相关内容