在 Linux 命令行中,一些符号具有特殊含义,它们能让你用简洁的方式批量操作文件、引用变量、执行命令替换。这些符号看似零碎,但掌握之后能极大提升操作效率。这里介绍最常用、最实用的几类。
1. 文件名通配符:* ? []
通配符用来匹配符合特定模式的文件名,主要在 ls、cp、mv、rm 等操作文件的命令中使用。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 直接展开(不需要文件存在),常与 echo、mkdir、cp 等结合使用。
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),是安全使用通配符的黄金法则。