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. ## 1.创建文件
  2. touch file{0..9}.txt
  3. ## 2.删除'file'开头,'.txt'结尾的所有文件
  4. 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,若包含空白符,则需引号