Linux Bash Shell预处理通配符有四种
* 表示0个或多个字符
? 表示1个任意字符
[ ] 中括号内包括字符集,表示可匹配其中之一。
{ } 花括号内包括字符集,表示可匹配其中之一,可用 , 逗号分隔字符集。
在 Shell 中执行命令时会先进行预处理,将通配符替换成匹配的文件或目录,如果没有找到匹配,则将通配符当成普通字符处理。
举例说明:
假设在当前目录下有 a1.txt 和 b1.txt 两个文件。可以写个脚本测试一下处理过程。
#脚本内容:
#!/bin/sh
#显示第一个参数
echo $1
#显示第二个参数
echio $2
#显示所有参数
echo $*
保存名为 scr 文件,并加上可执行权限: chmod +x scr
使用通配符 [] 显示指定文件,命令输入:
./scr [ab]1.txt
表示匹配 a1.txt 或 b1.txt 执行后显示结果
a1.txt
b1.txt
a1.txt b1.txt
这说明了 Shell 在预处理时,将 [ab]1.txt 替换成了 a1.txt a2.txt 然后传递给scr脚本。如果目录下没有 a1.txt 和 a2.txt 文件,即找不到匹配的文件,则(不替换)直接将 [ab]1.txt 当成普通字符传递给脚本。
使用通配符 {} 显示指定文件,命令输入:
./scr {a,b}1.txt
表示匹配 a1.txt 或 b1.txt 执行后显示结果
a1.txt
b1.txt
a1.txt b1.txt
使用通配符 ? 显示指定文件,命令输入:
./scr ?1.txt
表示匹配第1个字符任意,第2个字符是1并且前缀名是两个字符的.txt文件。即匹配 a1.txt 或 b1.txt 。 执行后显示结果
a1.txt
b1.txt
a1.txt b1.txt
使用通配符 * 显示指定文件,命令输入:
./scr *.txt
表示匹配所有的.txt文件。即匹配 a1.txt 或 b1.txt 。 执行后显示结果
a1.txt
b1.txt
a1.txt b1.txt
题外话:在 Windows 下的 CMD 命令行中,Shell 的不会处理通配符,而是直接传递给程序处理。例如,写个批处理测试下:
::批处理内容
@echo off
echo 第一个参数是:%1
echo 所有参数是:%*
保存为 test.cmd
假设当前目录下有 a1.txt b1.txt 两个文件。运行 test.cmd *.txt ,显示结果:
第一个参数是:*.txt
所有参数是:*.txt
说明了 CMD 的预处理不会对通配符进行匹配替换,而是交给程序处理。相比之下,Linux 的 Shell 预处理要强得多。