当前位置:首页 > 服务器技术 > 正文

Linux Shell字符串模式匹配(从零开始掌握Bash中的通配符与模式匹配技巧)

在Linux系统中,Shell不仅是命令行解释器,还提供了强大的字符串处理能力。其中,字符串模式匹配是日常脚本编写和文件操作中非常实用的功能。无论你是刚接触Linux的新手,还是希望巩固基础的中级用户,本文都将带你一步步理解并掌握Bash中的模式匹配

Linux Shell字符串模式匹配(从零开始掌握Bash中的通配符与模式匹配技巧) Shell  字符串匹配 Bash模式匹配 通配符 第1张

什么是字符串模式匹配?

字符串模式匹配是指使用特定的“模式”(pattern)来判断一个字符串是否符合某种结构。在Bash中,这种匹配通常用于文件名扩展(globbing)、条件判断(如 [[ ]] 中的 =~ 或 == 操作符)等场景。

常见的通配符(Wildcards)

Bash中最常用的通配符有以下几种:

  • *:匹配任意数量(包括零个)的任意字符。
  • ?:匹配任意单个字符。
  • [...]:匹配括号内的任意一个字符。例如 [abc] 匹配 a、b 或 c。
  • [!...][^...]:匹配不在括号内的任意字符。

示例1:使用通配符列出文件

$ ls *.txt          # 列出所有以 .txt 结尾的文件$ ls file?.log      # 列出 file1.log、fileA.log 等(? 代表一个字符)$ ls [a-c]*.sh      # 列出以 a、b 或 c 开头的 .sh 脚本

在条件判断中使用模式匹配

Bash的 [[ ]] 测试结构支持使用 ===~ 进行模式匹配。其中 == 使用的是通配符(glob pattern),而 =~ 使用的是正则表达式(regex)。

示例2:使用 == 进行通配符匹配

#!/bin/bashfilename="report_2023.txt"if [[ $filename == report_*.txt ]]; then  echo "这是一个报告文件!"fi

示例3:使用 =~ 进行正则匹配(进阶)

#!/bin/bashemail="user@example.com"if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then  echo "邮箱格式正确!"fi

注意:=~ 使用的是正则表达式,不属于本文重点讨论的“通配符模式匹配”,但了解它有助于区分两种匹配方式。

启用扩展模式匹配(extglob)

Bash还支持更强大的扩展模式匹配,需先启用 extglob 选项:

shopt -s extglob

启用后,可使用以下扩展模式:

  • ?(pattern):匹配0次或1次 pattern。
  • *(pattern):匹配0次或多次 pattern。
  • +(pattern):匹配1次或多次 pattern。
  • @(pattern):匹配恰好1次 pattern。
  • !(pattern):匹配除 pattern 外的任何内容。

示例4:使用 extglob 删除非 .txt 文件

shopt -s extglobrm -- !(*.txt)   # 删除当前目录下所有非 .txt 文件

常见误区与注意事项

  • 通配符 * 不会匹配以点(.)开头的隐藏文件,除非显式指定(如 .*)。
  • 在脚本中使用通配符时,若无匹配项,Bash 默认会保留原模式(如 *.xyz 若无匹配,变量值就是字面量 *.xyz)。可通过 shopt -s nullglob 改变此行为。
  • 模式匹配区分大小写(除非设置 shopt -s nocaseglob)。

总结

掌握Linux Shell字符串模式匹配能极大提升你在终端下的工作效率。无论是批量处理文件,还是在脚本中做条件判断,通配符都是不可或缺的工具。通过本文的学习,你应该已经了解了基本通配符、条件匹配、以及扩展模式的使用方法。多加练习,你很快就能像老手一样自如地使用这些功能!

关键词回顾:Linux Shell字符串匹配Bash模式匹配通配符