Bash 将目录更改为带有单引号和感叹号的子文件夹

Bash 将目录更改为带有单引号和感叹号的子文件夹,bash,escaping,Bash,Escaping,我正在尝试向下导航到bashshell中的子文件夹。子文件夹的名称为: 我们去玩吧 我不知道如何避开单引号(撇号)或感叹号。 我试过了 cd "Let's Go Play\!" cd "Let\'s Go Play\!" 谢谢 正确的形式是 cd "Let's Go Play!" 在双引号内,反斜杠并不特别,除非它们位于换行符、引号、反斜杠、美元符号或反勾号之前。完全删除反斜杠换行符;在该列表中,后跟其他四个字符之一的反斜杠将被删除,该字符将失去其特殊意义 在单引号中,反斜杠永远不会被删除,

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

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

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

正确的形式是

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
中即可将其关闭。如果关闭历史扩展,感叹号将失去所有特殊意义。然而,有些人似乎真的很喜欢历史的扩展,如果你是他们中的一员,你会拥有更多的权力。

正确的形式是

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
中即可将其关闭。如果你