为什么这两个相似的命令变体给出不同的输出?

为什么这两个相似的命令变体给出不同的输出?

命令1:

$ rm hello.txt 2>/dev/null || { echo “Couldn’t delete hello.txt” }
"Couldn't delete hello.txt"

命令2

$ rm hello.txt 2>/dev/null || { echo 'Couldn’t delete hello.txt' }
Couldn't delete hello.txt

笔记: hello.txt当前目录中不存在。

答案1

第一个命令

rm hello.txt 2>/dev/null || { echo “Couldn’t delete hello.txt” }

包含字符<U+201C>(左双引号)、<U+2019>(右单引号) 和<U+201D>(右双引号),这些字符对于 shell 来说没有任何特殊性,因此会照此输出。

第二条命令

rm hello.txt 2>/dev/null || { echo 'Couldn’t delete hello.txt' }

包含用单引号括起来的字符串;n和之间的字符t又是<U+2019>,这对 shell 来说并不特殊。

答案2

这对“”被称为智能报价。同样,你的inCouldn’t也是一个聪明的引用。

这些与普通的引号不同,因为它们是卷曲区分引用部分的开始和结束。它们在大多数(如果不是全部)编程/脚本语言中没有意义我知道并且与其他 Unicode 字符一样。

所以你的第一个echo实际上没有任何引用,命令将收到这些词作为单独的参数。你可以轻松检查

$ for s in “Couldn’t delete hello.txt”; do echo $s; done
“Couldn’t
delete
hello.txt”

$ for s in 'Couldn’t delete hello.txt'; do echo $s; done
Couldn’t delete hello.txt

实际上你的输出是错误的(你真的复制粘贴了吗?)因为智能引号在echo.输出应该仍然是智能引用,如上面的示例所示

如您所见,第二种情况是单身的字符串包含 ASCII 范围之外的 Unicode 字符,因此引号将被 shell 去除

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

相关内容