首页 > 解决方案 > 何时在 linux shell 命令中引用字符串?

问题描述

我发现 bash 命令有些不一致,我想澄清一下。

这里提到的评论说另外,请记住引用文件模式“.txt”,否则shell会扩展它。. 但是为什么命令

find . -name *.txt

获取不到错误,应该是用通配符扩展输出吧?

我还发现了一个很好的页面,解释了单引号和双引号的区别。但是为什么在正则表达式中使用单引号不会破坏它呢?例如

find . -regex '.*x.txt'

为什么这行得通,而不是寻找字面上称为的文件.*.txt

欢呼

标签: bashquoting

解决方案


*在调用命令行中包含的命令之前,shell 会扩展不带引号的模式(其中模式是包含模式元字符的单词)。在这种情况下,find . -name *.txt可能会扩展为 ,在这种情况下,find . -name a.txt b.txt c.txt只有命令的主要a.txt参数。为了防止这种扩展,您引用,因为您希望该文字字符串成为参数。-namefind*.txt

find . -name '*.txt'

find 它本身使用该模式来匹配递归当前目录时找到的每个文件。

bash让您有点懒惰,因为如果*.txt实际上不匹配任何内容,则默认情况下将其视为文字字符串。有一些 shell 选项可以改变这种行为:nullglob导致不匹配的模式简单地消失,就好像它从不存在一样,并failglob导致 shell 引发错误。但是,最好是明确的:如果您不打算对字符串进行路径名扩展,请引用它以确保它不能被扩展。


推荐阅读