Bash 何时在linux shell命令中引用字符串?
我发现一些与bash命令不一致的地方,我想澄清一下 这里提到的一条评论说。但是为什么命令Bash 何时在linux shell命令中引用字符串?,bash,quoting,Bash,Quoting,我发现一些与bash命令不一致的地方,我想澄清一下 这里提到的一条评论说。但是为什么命令 find . -name *.txt 没有获得错误,应该使用通配符扩展输出 我还找到了一个很好的页面来解释,。但是为什么在正则表达式中使用单引号不能打破它呢? 比如说 find . -regex '.*x.txt' 为什么这样做有效,而不查找字面上称为*.txt cheerr在调用命令行中包含的命令之前,shell将展开无引号的模式(其中模式是包含模式元字符的单词,如*)。在本例中,find-name*
find . -name *.txt
没有获得错误,应该使用通配符扩展输出
我还找到了一个很好的页面来解释,。但是为什么在正则表达式中使用单引号不能打破它呢?
比如说
find . -regex '.*x.txt'
为什么这样做有效,而不查找字面上称为*.txt
cheerr在调用命令行中包含的命令之前,shell将展开无引号的模式(其中模式是包含模式元字符的单词,如
*
)。在本例中,find-name*.txt
可能扩展为find-名称a.txt b.txt c.txt
,在这种情况下,只有a.txt
是查找
命令的-name
主参数。为了防止这种扩展,请引用*.txt
,因为您希望该文本字符串作为参数
find . -name '*.txt'
find
本身使用模式来匹配递归当前目录时找到的每个文件
bash
让您有点懒惰,因为如果*.txt
实际上不匹配任何内容,那么默认情况下它将被视为文本字符串。有一些shell选项可以更改此行为:nullglob
会导致不匹配的模式消失,就好像它从未存在过一样;failglob
会导致shell引发错误。但是,最好是明确的:如果您不希望字符串进行路径名扩展,请在调用命令行中包含的命令之前引用它以确保它无法扩展。shell将扩展未引用的模式(其中模式是包含模式元字符的单词,如*
)。在本例中,find-name*.txt
可能扩展为find-名称a.txt b.txt c.txt
,在这种情况下,只有a.txt
是查找
命令的-name
主参数。为了防止这种扩展,请引用*.txt
,因为您希望该文本字符串作为参数
find . -name '*.txt'
find
本身使用模式来匹配递归当前目录时找到的每个文件
bash
让您有点懒惰,因为如果*.txt
实际上不匹配任何内容,那么默认情况下它将被视为文本字符串。有一些shell选项可以更改此行为:nullglob
会导致不匹配的模式消失,就好像它从未存在过一样;failglob
会导致shell引发错误。但是,最好是明确的:如果您不打算对字符串进行路径名扩展,请引用它以确保其无法扩展。这与主题无关,因为它与编程无关。但是,请注意,如果shell通配符模式与任何内容都不匹配,则它将按原样传递给应用程序。您需要仔细考虑shell扩展的内容与应用程序处理的内容之间的区别。编写一个小实用程序,只打印它的参数,并尝试用不同的东西调用它。必要时。一旦你知道了引用的实际用途,你就可以很容易地判断出它是什么时候必要的,什么时候不必要。它可以是关于编程的。编写shell脚本是编程的一种形式。然而,它是非常广泛的。(当然标题中的问题是……)这是离题的,因为它与编程无关。但是,请注意,如果shell通配符模式与任何内容都不匹配,那么它将按原样传递给应用程序。您需要仔细考虑shell扩展的内容与应用程序处理的内容之间的区别。编写一个小实用程序,只打印它的参数,并尝试用不同的东西调用它。必要时。一旦你知道了引用的实际用途,你就可以很容易地判断出它是什么时候必要的,什么时候不必要。它可以是关于编程的。编写shell脚本是编程的一种形式。然而,它是非常广泛的。(当然标题中的问题是……)我;我只是在阅读我之前链接中的单票对双票的引用。在他的例子中,#11他说,全球化在任何类型的引用字符串中都不起作用。那么,为什么它在人们编写的每一个脚本(比如“*.txt”)中都能正常工作呢?@123:globbing在shell中不能在带引号的字符串中工作是正确的。但是find
不是shell的一部分,它是一个具有自己的全局搜索系统的外部程序。传递find
必须引用'*.txt'
的参数,因为在调用外部find
程序之前,shell会对其进行解析。如果未对其进行保护,则外壳将在启动find
之前跳入并展开它。@cdarke有趣的是,如何区分内部程序和外部程序之间的差异。内部程序只是我们自己编写的脚本,外部程序是在操作系统中预编译的吗?不,内部命令是由shell本身实现的。有些不能作为外部命令实现(如cd
,它改变了shell的状态),而另一些可以作为其中之一实现(如test
,两者都存在;内部版本更有效,因为它不需要分叉新的进程)。shell的文档(例如手册页)将列出受支持的内置内部命令。正如@chepner所说,但是发现命令是内置的还是外部的一种简单方法是使用type
命令。试试键入cd
,键入echo
,键入ls
,键入find
,键入[[
。如果你得到哈希值
,这意味着它是一个缓存路径的外部程序。我只是从以前的链接中读取单引号和双引号。在他的考试中