【问题标题】:Change directory to subfolder with single quotes and exclamation mark将目录更改为带有单引号和感叹号的子文件夹
【发布时间】:2018-05-23 10:53:51
【问题描述】:

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

我不知道如何转义单引号(撇号)或感叹号。 我试过了

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

谢谢。

【问题讨论】:

  • bash 用tab 自动完成它...

标签: bash escaping


【解决方案1】:

正确的形式是

cd "Let's Go Play!"

在双引号内,反斜杠并不特殊,除非它们出现在换行符、引号、反斜杠、美元符号或反引号之前。反斜杠换行符被完全删除;后跟该列表中其他四个字符之一的反斜杠将被删除,该字符将失去其特殊意义。

在单引号内,反斜杠永远不会被删除并且没有特殊意义。因此,不可能在单引号字符串中插入单引号,因此上述cd 命令不存在单引号形式。但是,你可以连接单词,所以你可以这样写:

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

在引用的单词之外,反斜杠更通用。从输入中删除后跟除换行符以外的任何字符的反斜杠,并且后面的字符变成普通字符(即使它已经是普通字符)。反斜杠换行符完全从输入中删除,因此无法将换行符插入到未引用的字符串中。

所以你可以这样写:

cd Let\'s\ Go\ Play\!

但双引号的版本似乎更简单。

感叹号是对 Posix 标准的扩展(上述规则直接来自 Posix 标准),而 bash 的实现有点古怪,有时真的很烦人。感叹号引入历史扩展,除非它们在单引号内,前面有反斜杠,或者后面有空格或等号或(如果启用了 shell 选项 extglob)一个左括号。在双引号内,感叹号在结束引号之前也不是特别的。 (您可以将历史扩展字符更改为感叹号以外的其他内容,因此从技术上讲,我应该写“历史扩展字符”。)

即使反斜杠使感叹号不特殊,反斜杠也不会从输入流中删除,除非它已被 Posix 规则删除。所以感叹号在

echo "a\!b"

是一个普通字符(它前面有一个反斜杠),但是反斜杠也是一个普通字符(它后面没有跟双引号列表中的一个字符),所以结果是

a\!b

(虽然我从 bash 手册中复制了这些规则,但我知道还有一些其他情况会抑制历史扩展,例如感叹号是参数扩展的一部分时,例如 $!${!name}。并且我想还有更多这样的例外,我不记得了。)

我觉得这一切都很烦人,而且我很少依赖历史扩展,所以我只需将 set +H 添加到我的 bash 启动文件 ~/.bashrc 即可将其关闭。如果您关闭历史扩展,那么感叹号将失去所有特殊意义。但是,有些人似乎真的很喜欢历史扩展,如果您是其中之一,那么您将获得更大的力量。

【讨论】:

  • Egad,感叹号规则比我想象的要混乱得多!
猜你喜欢
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2017-05-14
  • 2014-07-30
  • 2012-11-01
  • 1970-01-01
  • 2013-09-21
相关资源
最近更新 更多