命令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 去除