原文地址:http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html
说到shell通配符(wildcard),大家在使用时候会经常用到。下面是一个实例:
1
2
|
[chengmo@localhost ~ /shell ]$ ls
a.txt b.txt c.old |
1
2
|
[chengmo@localhost ~ /shell ]$ ls *.txt
a.txt b.txt |
1
2
|
[chengmo@localhost ~ /shell ]$ ls d*.txt
ls : 无法访问 d*.txt: 没有那个文件或目录
|
从上面这个实例,不知道大家有没有发现问题呢。我们先了解一下,通配符相关知识,再分析下这个实例吧。
一、linux shell通配符(wildcard)
通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里(它不用在 命令名称里, 也不用在 操作符上)。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
我们回过头分析上面命令吧:在第2个命令中,*.txt 实际shell搜索文件,找到了符合条件的文件,命令会变成:ls a.txt b.txt ,实际在执行ls 时候传给它的是a.txt b.txt .
而命令3,d*.txt 由于当前目录下面没有这样的文件或目录,直接将”d*.txt” 作为ls 参数,传给了 ls .这个时候”*” 只是一个普通的 ls 参数而已,已经失去了它通配意义。 由于找不到文件,所以会出现:无法访问提示!
了解了shell通配符,我们现在看下,shell常见通配符有那一些了。
shell常见通配符:
字符 含义 实例 * 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 ? 匹配任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 [list] 匹配 list 中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 [!list] 匹配 除list 中的任意单一字符 a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。 {string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。
需要说明的是:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。而且涉及的只有,*,? [] ,{} 这几种。
二、shell元字符(特殊字符 Meta)
shell 除了有通配符之外,由shell 负责预先先解析后,将处理结果传给命令行之外,shell还有一系列自己的其他特殊字符。
字符 说明 IFS 由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。 CR 由 <enter> 产生。 = 设定变量。 $ 作变量或运算替换(请不要与 shell prompt 搞混了)。 > 重导向 stdout。 * < 重导向 stdin。 * | 命令管线。 * & 重导向 file descriptor ,或将命令置于背境执行。 * ( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 * { } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。 ; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 * && 在前一个命令结束时,若返回值为 true,继续执行下一个命令。 * || 在前一个命令结束时,若返回值为 false,继续执行下一个命令。 * ! 执行 history 列表中的命令。* 加入”*” 都是作用在命令名直接。可以看到shell 元字符,基本是作用在命令上面,用作多命令分割(或者参数分割)。因此看到与通配符有相同的字符,但是实际上作用范围不同。所以不会出现混淆。
以下是man bash 得到的英文解析:
metacharacter
A character that, when unquoted, separates words. One of the following:
| & ; ( ) < > space tab
control operator
A token that performs a control function. It is one of the following symbols:
|| & && ; ;; ( ) | <newline>
三、shell转义符
有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。
字符 说明 ‘’(单引号) 又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。 “”(双引号) 又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替 \(反斜杠) 又叫转义,去除其后紧跟的元字符或通配符的特殊意义。 man bash 英文解释如下:
There are three quoting mechanisms: the escape character, single quotes, and double quotes.
实例:
12345678[chengmo@localhost ~
/shell
]$
ls
\*.txt
ls
: 无法访问 *.txt: 没有那个文件或目录
[chengmo@localhost ~
/shell
]$
ls
'*.txt'
ls
: 无法访问 *.txt: 没有那个文件或目录
[chengmo@localhost ~
/shell
]$
ls
'a.txt'
a.txt
[chengmo@localhost ~
/shell
]$
ls
*.txt
a.txt b.txt
可以看到,加入了转义符 “*”已经失去了通配符意义了。
四、shell解析脚本的过程
看到上面说的这些,想必大家会问到这个问题是,有这么想特殊字符,通配符,那么 shell在得到一条命令,到达是怎么样处理的呢?我们看下下面的图:
如果用双引号包括起来,shell检测跳过了1-4步和9-10步,单引号包括起来,shell检测就会跳过了1-10步。也就是说,双引号 只经过参数扩展、命令代换和算术代换就可以送入执行步骤,而单引号转义符直接会被送入执行步骤。而且,无论是双引号转义符还是单引号转义符在执行的时候能 够告诉各个命令自身内部是一体的,但是其本身在执行时是并不是命令中文本的一部分。
相关推荐
Linux Shell 通配符、元字符、转义符使用实例介绍 Linux Shell 中的通配符(Wildcard)是由 Shell 处理的,它只会出现在命令的参数里,不会出现在命令名称里或操作符上。当 Shell 在参数中遇到了通配符时,Shell 会...
本文将详细介绍Shell编程的基础知识,包括Shell的概述、创建和执行Shell程序、Shell编程语法以及实例。 1. **Shell概述** - Shell是一个命令解释器,它接收用户的输入并执行相应的系统命令。在Linux中,主要有几种...
本节主要介绍了基础正则表达式的元字符以及其具体的应用。 正则表达式与通配符虽然都用于模式匹配,但它们之间存在重要的区别。正则表达式能够匹配字符串中的特定模式,而通配符则用于匹配文件名。在Shell中,像...
- **元字符转义**:使用`\`对特殊字符进行转义,如`\*`匹配星号字符本身。 7. **Shell编程技巧**: - **条件测试**:`test`命令或`[ ]`结构用于进行逻辑判断。 - **逻辑运算符**:`&&`和`||`用于条件连接,`!`...
#### 二、Shell元字符及其使用方法 1. **单引号('')**:用于将其中的所有字符都视为字面量,即不解析任何特殊符号。 - 示例:`echo 'Hello, world!'` 将直接输出 `Hello, world!`,即使字符串中含有特殊字符或...
"Linux Shell 通配符、元字符、转义符使用实例介绍.docx"则专注于Shell中的特殊字符,如星号(*)匹配任意多个字符,问号(?)匹配单个字符,方括号([])用于匹配指定范围内的字符。转义符(\)用于取消特殊字符的特殊含义...
在IT领域,尤其是在Linux系统管理中,Bash Shell、awk和sed是不可或缺的工具,它们在文本处理和自动化任务执行方面发挥着重要作用。本指南将深入解析这些工具的使用实例和精解,帮助读者理解并掌握这些强大的命令行...
| \ | 转义符,屏蔽元字符的特殊意义 | | \<\> | 精确匹配符号 | | \{n\} | 匹配前面字符出现n次 | | \{n,\} | 匹配前面字符至少出现n次 | | \{n,m\} | 匹配前面字符出现n次到m次 | **实例解析** - **任意次数重复...
5. **转义字符**:`\`用于转义元字符,使其变为普通字符,如`\.`表示匹配实际的点号。 ### 三、正则表达式的分类 1. **基本正则表达式(BREs)**:这是最早的正则表达式形式,使用`\`作为转义字符,并用`\(`和`\)`...
通过本书的学习,你将能够掌握如何在各种编程环境中运用正则表达式解决问题,特别是在Linux系统下的Shell脚本编程中。 #### 1. 正则表达式入门 ##### 解决实际问题 正则表达式作为一种强大的文本处理工具,在日常...
3.6 元字符与文件名生成 67 3.7 转义与引用 69 3.8 命令历史 72 3.8.1 fc命令 72 3.8.2 history命令 74 3.8.3 重复执行先前的命令 75 3.8.4 编辑并执行校正后的命令 76 3.8.5 命令行补充 77 3.9 命令别名 79 3.10 ...
3.6 元字符与文件名生成 67 3.7 转义与引用 69 3.8 命令历史 72 3.8.1 fc命令 72 3.8.2 history命令 74 3.8.3 重复执行先前的命令 75 3.8.4 编辑并执行校正后的命令 76 3.8.5 命令行补充 77 3.9 命令别名 79 3.10 ...
第8章 获得控制:正则表达式元字符 8.1 正则表达式元字符 8.1.1 用于单字符的元字符 8.1.2 白空元字符 8.1.3 重复模式匹配的元字符 8.1.4 tr或y函数 8.2 统一字符编码(Unicode) 练习7 是sed、awk或...
gawk扩展了标准awk的正则表达式功能,支持更多的元字符。 #### 8. POSIX字符集 POSIX字符集允许使用特殊字符集合进行匹配,如`[[:alpha:]]`表示匹配任何字母字符。 #### 9. 匹配操作符(`~`) 用于测试一个字符串...
- 不同的shell可能支持不同的特殊字符,但一些常见的如`*`(匹配任意字符)、`?`(匹配单个字符)等是共通的。 - **C-shell**(4.3 Le C-shell) - C-shell是早期Unix系统中常用的一种命令解释器。 - 特点包括...
Bash是Unix/Linux系统中的命令行解释器,用于执行shell脚本。关键概念有: 1. 命令行参数:$0表示脚本名,$1到$9表示传递的前9个参数。 2. 变量:使用等号赋值,如`VAR=value`。export使变量在子进程中可见。 3. ...