人人都会AI编程

13.4 通配符与特殊符号:*、?、[]、{}、$、` 等符号用法

更新时间:2026-07-12

在 Linux 命令行中,一些符号具有特殊含义,它们能让你用简洁的方式批量操作文件、引用变量、执行命令替换。这些符号看似零碎,但掌握之后能极大提升操作效率。这里介绍最常用、最实用的几类。

1. 文件名通配符:* ? []

通配符用来匹配符合特定模式的文件名,主要在 lscpmvrm 等操作文件的命令中使用。Shell 在命令执行前会先把通配符展开成实际的文件列表(这个过程称为“文件名展开”或“globbing”)。

  • ***:匹配任意长度(包括零个)的任意字符。
  ls *.txt          # 列出所有以 .txt 结尾的文件
  rm *.log          # 删除所有 .log 文件
  mv backup* /tmp/  # 移动所有以 backup 开头的文件
  
  • ?:匹配单个任意字符。
  ls file?.txt      # 匹配 file1.txt、fileA.txt,但不匹配 file10.txt
  mv photo??.jpg /archive/  # 移动 photo 后跟两个字符的 jpg 文件
  
  • []:匹配方括号内所列字符中的任意一个。可以用 - 表示连续范围,例如 [0-9] 匹配任意数字,[a-z] 匹配小写字母。也可以用 !^ 放在开头表示取反匹配。
  ls data[123].csv      # 匹配 data1.csv、data2.csv、data3.csv
  ls report[0-9][0-9].txt  # 匹配 report00.txt 到 report99.txt
  ls log[!0-9]*          # 匹配 log 后第一个字符不是数字的任何文件
  

注意:通配符与正则表达式的语法不同,* 在正则里表示重复零次或多次前面的字符,但在通配符中它直接代表任意字符串。这是初学者最常见的混淆点。

2. 花括号展开:{}

花括号 {} 用于生成一组字符串,通常用来创建序列或有共同部分的文件名列表。它由 Shell 直接展开(不需要文件存在),常与 echomkdircp 等结合使用。

echo file{1,2,3}.txt   # 输出 file1.txt file2.txt file3.txt
mkdir -p project/{src,doc,test}   # 一次创建 project/src、project/doc、project/test 三个目录
cp config.{bak,orig}   # 等价于 cp config.bak config.orig
echo {a..e}            # 支持范围:输出 a b c d e
echo {01..10}          # 输出 01 02 ... 10(等宽数字)
echo {a..z..3}         # 步长:a d g j m p s v y

花括号展开在进行批量重命名、生成测试文件或结构化目录时非常方便。注意花括号内不能有空格(除非用引号保护),否则会被当作普通字符。

3. 变量引用:$

$ 符号用来获取变量的值或执行参数替换。在 Shell 脚本和交互式命令行中无处不在。

name="Linux"
echo $name             # 输出 Linux
echo ${name}           # 标准写法,可明确变量边界:echo ${name}_OS 输出 Linux_OS
echo $HOME             # 输出当前用户的家目录
echo $((3+5))          # $((...)) 进行算术运算,输出 8

还有一种特殊形式 ${var:-default} 用于提供默认值,例如 ${USER:-guest} 表示如果 USER 变量为空,则使用 guest。这增强了脚本的健壮性。

4. 命令替换:` `$()`

将一条命令的输出嵌入到另一条命令的参数或变量赋值中。

  • 反引号风格:` command `
  • 现代推荐风格$(command) (支持嵌套,可读性更好)
today=$(date +%F)         # 将当前日期赋值给 today
echo "当前目录有 $(ls | wc -l) 个文件"
kernal_version=`uname -r` # 老式写法

命令替换在脚本中极其常用,比如用 for i in $(seq 1 10) 做循环,或者生成带时间戳的备份文件名:

cp log.txt backup_$(date +%H%M%S).txt

5. 引号的区分:保护特殊符号

虽然标题未专门列出引号,但 $、` `*` 等符号常需要受引号控制是否解析。这里简要对比三种引号的作用,以保证符号用法不产生意外。

  • 单引号 '...':所有字符原样输出,$、` `*` 等都失去特殊含义,纯文本。
  echo 'Today is $USER'   # 输出 Today is $USER
  
  • 双引号 "...":大部分特殊字符被保留,但 $、` `\` 依然有效,可进行变量替换和命令替换。
  echo "Today is $USER"   # 输出 Today is root(若为 root 用户)
  
  • 反斜线 \:转义紧随其后的单个字符,使其变为字面量。
  echo \$HOME             # 输出 $HOME 而不是变量值
  

6. 实用速查与组合示例

最后,将这些符号组合起来看几个真实场景:

# 统计所有 .log 文件大小之和
total=$(du -c *.log | tail -1 | cut -f1)

# 批量备份最近 7 天的日志
for f in app-{01..07}.log; do
    cp $f /backup/$f.bak
done

# 找出当前目录下不以 a 或 b 开头的 .txt 文件
ls [^ab]*.txt

# 生成带日期前缀的备份文件列表
backups="backup/$(date +%Y%m%d)_{conf,data,log}.tar.gz"
echo $backups

掌握这些符号,相当于学会了一门灵活的命令行“语法”,让你可以用更少的输入完成更复杂的文件操作和脚本逻辑。记住,先做无害的 echo 测试,确认展开结果后再执行有风险的操作(如 rm),是安全使用通配符的黄金法则。