bash - 何时在 linux shell 命令中引用字符串?
问题描述
我发现 bash 命令有些不一致,我想澄清一下。
这里提到的评论说另外,请记住引用文件模式“.txt”,否则shell会扩展它。. 但是为什么命令
find . -name *.txt
获取不到错误,应该是用通配符扩展输出吧?
我还发现了一个很好的页面,解释了单引号和双引号的区别。但是为什么在正则表达式中使用单引号不会破坏它呢?例如
find . -regex '.*x.txt'
为什么这行得通,而不是寻找字面上称为的文件.*.txt
欢呼
解决方案
*
在调用命令行中包含的命令之前,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 引发错误。但是,最好是明确的:如果您不打算对字符串进行路径名扩展,请引用它以确保它不能被扩展。
推荐阅读
- c# - 通过 Ajax 调用将经过身份验证的 WIF 会话从 Web App A 传递到 Web App B
- web-crawler - FastUrlFilter 不适用于多个域
- c# - MVC 错误:尽管输入了有效信息,但仍返回“错误”视图而不是“成功”视图
- c++ - 如何使用 const char* 和/或字符串重载 operator=?
- directed-acyclic-graphs - 在图论中,一个强连通分量SCC是否构成一个DAG?
- python - 用python列表中的元素替换字典的值
- c++ - C++ 刽子手项目
- sml - 如何从文件中正确导入模块?
- rust - 如何将非常大的十进制字符串转换为十六进制?
- django - 将多个 uwsgi 记录器记录到标准输出