使用单引号和感叹号将目录更改为子文件夹

时间:2018-05-23 02:01:53

标签: bash escaping

我试图向下导航到bash shell中的子文件夹。子文件夹的名称是: 我们去玩吧!

我无法弄清楚如何逃避单引号(撇号)或感叹号。 我试过了

cd "Let's Go Play\!"
cd "Let\'s Go Play\!"

感谢。

1 个答案:

答案 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来关闭它。如果关闭历史记录扩展,那么感叹号将失去所有特殊意义。然而,有些人似乎真的喜欢历史扩张,如果你是其中之一,那么对你有更大的权力。