什么时候在Linux Shell命令中引用字符串?

时间:2018-07-18 03:14:06

标签: bash quoting

我发现与bash命令有些矛盾,我想澄清一下。

此处提到的评论是Also, remember to quote the file pattern ".txt" or the shell will expand it.。但是,为什么命令

find . -name *.txt

没有得到错误,应该使用通配符扩展输出?

我还找到了一个很好的页面,说明了Differences in single quotes and double quotes。但是,为什么在正则表达式中使用单引号不会破坏它呢? 例如

find . -regex '.*x.txt'

为什么这样做,而不查找字面上称为.*.txt的文件

Cheersr

1 个答案:

答案 0 :(得分:2)

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

find . -name '*.txt'

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

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