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,若包含空白符,则需引号 |