单引号是不是将反斜杠视为 bash 脚本中的特殊字符?

Posted

技术标签:

【中文标题】单引号是不是将反斜杠视为 bash 脚本中的特殊字符?【英文标题】:Do single quotes treat backslashes as special in bash scripting?单引号是否将反斜杠视为 bash 脚本中的特殊字符? 【发布时间】:2015-09-24 05:48:49 【问题描述】:

从我读过的here 来看,它说“在单引号内,除了' 之外的每个特殊字符都会按字面意思解释”。所以,我认为反斜杠(“\”)也会被逐字解释。

但是,当我尝试在别名中使用它时,它仍然会被解释为特殊字符:

alias somefolder='cd /Some\ path/with\ spaces/'

...仍然有效吗?

但事实并非如此:

alias somefolder='cd /Some path/with spaces/'

这让我感到惊讶,因为我认为单引号的全部意义应该是为了懒惰,即当您不使用 $ 扩展任何变量时(因为这需要双引号)。

我真的怀疑 tldp 来源是错误的,那么有没有更好的方法来解释这一点?谢谢。

【问题讨论】:

与引号无关。它与别名扩展有关,这是字符串 value 的字面意思。只在路径周围加上引号。 ... 这是应该使用 shell 函数而不是别名的众多原因之一。 mywiki.wooledge.org/BashFAQ/080 still....我对此感到更加困惑:alias somefolder='cd '/Some path/with spaces/'' 不起作用,正如我在问题中所说的那样。但是,从命令行,cd '/Some path/with spaces/' 是否工作? ...所以如果别名扩展去掉了单引号,那么为什么在 cd 之后的路径名周围加上另一组单引号不起作用? 【参考方案1】:

这是因为别名会被shell扩展,在这个过程中单引号会被去掉。因此,在别名扩展之后,您将拥有

cd /Some path/with spaces/

如你所说,剩下的会失败。

但是当您使用\ 转义空格时,在扩展别名(并删除单引号)后,shell 将执行以下操作:

cd /Some\ path/with\ spaces/

这将按预期工作。

【讨论】:

更准确地说,在创建别名时引号已经被删除。 感谢您的回答。但是,这仍然有些奇怪,请参阅我对我的问题的评论。谢谢。【参考方案2】:

啊,但是您正在构建的别名正在将您的单引号 var 放到 cd 命令中,这让您感到窒息

cd /Some path/with spaces/

因为cd 不知道如何处理空间,而不是你的 bash。

当您将\ 添加到字符串时,如

'cd /Some\ path/with\ spaces/'

解释\的是cd,而不是仅仅是一个信使的bash。

【讨论】:

以上是关于单引号是不是将反斜杠视为 bash 脚本中的特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

shell中单引号双引号反斜杠简说

python脚本入参的单、双引号

Perl中的反斜杠单引号

Linux shell中,双引号"",单引号'',反引号``之间的区别

正则表达式

Shell中的Quoting