简介
模式扩展(globbing),Bash 中提供了八种扩展
- 波浪线扩展
?
字符扩展*
字符扩展- 方括号扩展
- 大括号扩展
- 变量扩展
- 子命令扩展
- 算术扩展
开启/关闭扩展
- 开启
set -o noglob
或set -f
- 关闭
set +o noglob
或set +f
波浪线扩展
~
会自动扩展为用户主目录,~user
会扩展为指定用户的主目录
例如:
1 | echo ~ |
?
字符扩展
?
字符代表单个字符(不包括空字符)
1 | ls abc??.txt |
只有文件存在时才会发生扩展,如果没有文件匹配,则会原样输出。
*
字符扩展
*
匹配任意数量的任意字符,包括零个字符
1 | ls *.md |
与 ?
类似,如果没有文件匹配,则会原样输出。
*
只匹配当前目录,如需匹配子目录,每个层级都需要一个 *
号,如 */*/*/*.txt
Bash 4.0 后引入 globstar,可以使用 **
匹配零个或多个子目录。例如 **/*.txt
方括号扩展
[abcd]
方括号会匹配括号中的任意字符,这里匹配 a/b/c/d
可以使用 [^...]
或 [!...]
来匹配除了括号中的字符
[a-z] 相当于 [abcdef…z]
- 如需匹配
-
需放在开头或结尾 [-123] 或 [123-] [
或]
也可放在方括号中
大括号扩展
大括号 {a,b,c}
会挨个展开括号中逗号隔开的值,如 {a,b,c}.txt
展开为 a.txt b.txt c.txt。
- 注意,括号中逗号前后不能有空格,否则会扩展失效
- 括号可以嵌套
{a,b{1,2},c}
- 可以使用形如
{a..z}
进行连续扩展,相当于{a,b,c,d...,z}
可以结合 for 循环使用:
1 | for i in {0..9} |
可以指定扩展的前缀:
{01..9} 扩展为 01 02 03 04 …. 09
可以指定步长 {start..end..step}
例如 {0..8..2} 扩展为 0 2 4 6 8
连续多个形成笛卡尔积:
{a..c}{1..3} 扩展为 a1 a2 a3 b1 b2 b3 c1 c2 c3
变量扩展
$
可用来展开变量,获取变量的值,例如 $SHELL
即展开变量 SHELL
的值。
- 变量也可放在花括号中,例如
${SEHLL}
- 可使用
${!string*}
或${!string@}
匹配以string
开头的变量名(注意这里是扩展为变量名,测试在 BASH 中开启) - 变量值是另外一个变量名,可以使用
${!var_name}
扩展
子命令扩展
$(command)
可以扩展命令运行的结果。
- 比较老的语法:
1 | `command` |
- 该语法可以嵌套,例如
$(ls $(pwd))
算术扩展
使用 $((...))
进行算术运算
例如 echo $((2 + 4))
字符类
[[:class:]]
用来表示某个字符类,可以匹配某一类字符。
[[:alnum:]]
:匹配任意英文字母与数字[[:alpha:]]
:匹配任意英文字母[[:blank:]]
:空格和 Tab 键。[[:cntrl:]]
:ASCII 码 0-31 的不可打印字符。[[:digit:]]
:匹配任意数字 0-9。[[:graph:]]
:A-Z、a-z、0-9 和标点符号。[[:lower:]]
:匹配任意小写字母 a-z。[[:print:]]
:ASCII 码 32-127 的可打印字符。[[:punct:]]
:标点符号(除了 A-Z、a-z、0-9 的可打印字符)。[[:space:]]
:空格、Tab、LF(10)、VT(11)、FF(12)、CR(13)。[[:upper:]]
:匹配任意大写字母 A-Z。[[:xdigit:]]
:16进制字符(A-F、a-f、0-9)。
注意事项
- Bash 会先进行模式扩展,再执行命令
- 文件名扩展如果没有匹配到文件,扩展会原样输出
- 多层路径需要手动添加 / ,Bash 4.0 增加
**
用来匹配零个或多个子路径 - 创建的文件名中可以包含通配符(需使用单引号包裹)
extglob
可以使用以下命令启用或禁用该特性:
1 | 查询开启状态 |
extglob 允许更复杂的模式匹配(其中 pattern-list 是由 |
分隔的模式表达式):
?(pattern-list)
: 匹配零个或一个模式*(pattern-list)
: 匹配零个或多个模式+(pattern-list)
: 匹配一个或多个模式@(pattern-list)
: 只匹配一个模式!(pattern-list)
: 匹配指定模式之外的内容
例如:
1 | 匹配零个或一个 def |
shopt 命令
shopt 命令可以调整 Bash 的特性:
- 开启
shopt -s [option_name]
- 关闭
shopt -u [option_name]
- 查询
shopt [option_name]
option_name:
dotglob
- 扩展结果包含隐藏文件(以 . 开头的文件)nullglob
- 不匹配任何文件时,返回空字符failglob
- 不匹配任何文件直接报错extglob
- 开启量词语法支持nocaseglob
- 通配符扩展不区分大小写globstar
- 支持**
来匹配零个或多层目录