我试图向下导航到bash shell中的子文件夹。子文件夹的名称是: 我们去玩吧!
我无法弄清楚如何逃避单引号(撇号)或感叹号。 我试过了
cd "Let's Go Play\!"
cd "Let\'s Go Play\!"
感谢。
答案 0 :(得分:3)
正确的表格是
cd "Let's Go Play!"
在双引号内,反斜杠并不特殊,除非它们出现在换行符,引号,反斜杠,美元符号或反引号之前。反斜杠 - 换行符完全删除;将删除该列表中其他四个字符之一的反斜杠,并且该字符将失去其特殊意义。
在单引号内,反斜杠永远不会被删除,没有特别的意义。因此,不可能将单引号插入单引号字符串中,因此上述cd
命令没有单引号形式。但是,你可以连接单词,所以你可以写:
cd 'Let'"'"'s Go Play!'
除了引用的单词之外,反斜杠更为通用。从输入中删除反斜杠后跟除换行符之外的任何字符,后续字符变为普通字符(即使它已经是普通字符)。反斜杠 - 换行符完全从输入中删除,因此无法在不带引号的字符串中插入换行符。
所以你可以写:
cd Let\'s\ Go\ Play\!
但双引号版似乎更简单。
Exclamations点是Posix标准的扩展(上述规则直接来自Posix标准),bash实现有点古怪,有时真的很烦人。感叹号引入历史扩展,除非它们在单引号内,前面有反斜杠,或者后跟空格或等号或(如果启用了shell选项extglob
)一个左括号。在双引号内,感叹号在结束报价之前也不是特别的。 (您可以将历史记录扩展字符更改为感叹号以外的其他字符,因此从技术上讲,我应该编写"历史记录扩展字符"。)
即使反斜杠使感叹号不合适,也不会从输入流中删除反斜杠,除非它已被Posix规则删除。
中的感叹号echo "a\!b"
是一个普通字符(前面是反斜杠),但反斜杠也是普通字符(双引号列表中没有其中一个字符),所以结果是
a\!b
(虽然我从bash手册中复制了这些规则,但我知道在某些其他情况下会抑制历史记录扩展,例如感叹号是参数扩展的一部分,例如$!
或{{1我认为还有更多这些例外情况我无法记得。)
我觉得所有这些都很烦人,而且我对历史扩展的依赖很少,我只是通过将${!name}
添加到我的bash启动文件set +H
来关闭它。如果关闭历史记录扩展,那么感叹号将失去所有特殊意义。然而,有些人似乎真的喜欢历史扩张,如果你是其中之一,那么对你有更大的权力。