4. 通配符及参数扩展
通配符
对一个文件对象执行命令操作是容易操作的。但是,如果要对成千上百个文件执行相同的操作,手打命令是一个低效的形式。要解决这个问题,可以使用 bash shell 中内置的通配符,通过通配符指定多个文件。这种匹配按照如下方式完成(注:通配符和正则表达式在用法上有一点小区别):
| 字符 | 含义 | 实例 | |
|---|---|---|---|
| * | 匹配 0 或多个字 符 | a*b | a 与b之间可以有任意长度的任意字符,也可以一个 也没有,如ab, aab, acccccdb, a24322qqb。 |
| ? | 匹配任意单一字 符 | a?b | a与b之间必须有一个任意字符,如aqb, acb,a7b。 |
| [list] | 匹配list中的任意 单一字符 | a[xyz]b | a与b之间必须是list列出的任意一个字符, 如: axb,ayb,azb。 |
| [!list] | 匹配除list中的任 意单一字符 | a[!0-9]b | a与b之间必须是除去阿拉伯字符的任意一个字符,如axb,aab,a-b。 |
| [c1-c2] | 匹配 c1-c2 中的 任意单一数字 | a[0-9]b | a与b之间必须是0与9之间的一个字符,如a0b,a1b…a9b。 |
| {string1…} | 匹配 sring1或其 他字符串之一 | a{abc,xyz,123}b | a与b之间只能是abc或xyz或123这三个字符串之一。 |
示例:
## 1.创建文件touch file{0..9}.txt## 2.删除'file'开头,'.txt'结尾的所有文件rm file*.txt
shell 元字符
shell 除了有通配符之外,还有一系列的其他特殊字符,称之为元字符
| 字符 | 说明 |
|---|---|
| = | 设定变量。 |
| # | 注释符号:在脚本当中常用,视为说明,在井号后的代码均不执行 |
| $ | 调用变量时需要加上 $ 符号或运算替换。 |
| \ | 转义符:将【特殊字符或通配符】还原成一般字符,另一个作用是续行符 |
| > | 重导向 stdout。两个大于号 >> 表示追加 |
| < | 重导向 stdin。 |
| ~ | 用户的家目录 |
| | | 命令管线。 |
| & | (常用)将命令置于背境执行。 |
| ( ) | 将其内的命令置于nested subshell执行,或用于运算或命令替换。 |
| {} | 将其内的命令置于non-named function中执行,或用在变量替换的界定范围。 |
| ; | 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 |
| && | 在前一个命令结束时,若返回值为true,继续执行下一个命令。 |
| || | 在前一个命令结束时,若返回值为false,继续执行下一个命令。 |
| ‘ ‘ | 单引号,注意单引号中的变量不会被解释,即作为纯文本 |
| “ “ | 双引号,注意双引号中的变量会被解释,即变量有意义 |
|
两个反引号 ` 中间的命令会被先执行,亦可使用 $( ) |
参数扩展
很方便的截取文件名和后缀
| 参数形式 | 扩展后 |
|---|---|
| x{y,z} | xy xz |
| ${x}{y,z} | ${x}y ${x}z |
| ${x}{y,$z} | ${x}y ${x}${z} |
| ${param#pattern} | 从param前面删除pattern的最小匹配 |
| ${param##pattern} | 从param前面删除pattern的最大匹配 |
| ${param%pattern} | 从param后面删除pattern的最小匹配 |
| ${param%%pattern} | 从param后面删除pattern的最大匹配 |
| ${param/pattern/string} | 从param中用string替换pattern的第一次匹配,string可为空 |
| ${param/patern/string} | 从param中用string替换pattern的所有匹配,string可为空 |
| ${param:3:2} | 截取$param中索引3开始的2个字符 |
| ${param:3} | 截取$param中索引3至末尾的字符 |
| ${@:3:2} | 截取参数列表$@中第3个开始的2个参数 |
| ${param:-word} | 若$param为空或未设置,则参数式返回word,$param不变 |
| ${param:+word} | 若$param为非空,则参数式返回word,$param不变 |
| ${param:=word} | 若$param为空或为设置,则参数式返回word,同时$param设置为word |
| ${param:?message} | 若$param为空或为设置,则输出错误信息message,若包含空白符,则需引号 |
