编辑:戈登·戴维森的评论回答了问题
我正在阅读 GNU Bash 手册,我注意到基本上有三种类型的“参数扩展”可以进行模式匹配:
${parameter#word} ${parameter##word}
${parameter%word} ${parameter%%word}
${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}
我发现奇怪的是前两种是这样描述的:
该单词被扩展以产生模式并根据下面描述的规则进行匹配(请参阅模式匹配)。
但第三种是这样描述的:
该模式被扩展以产生一个模式,就像文件名扩展一样。 [...] 匹配是根据下面描述的规则执行的(请参阅模式匹配)。
所以我想知道,扩展之间真的有区别吗?前两个描述并不完全清楚进行何种扩展,但无论如何,“模式匹配”规则实际上与“文件名扩展”相同。
那么也许这是文档不够清晰的问题,我们可以说它们都是一样的?
我的猜测是前两种描述更准确,因为我怀疑在第三种期间执行任何类型的实际文件系统检查。
答案1
a*k
模式匹配是指模式匹配的思想aardvark
。
文件名扩展用途模式匹配。它扫描文件系统中的目录条目,收集与给定模式匹配的名称。
在 shell 中,模式匹配不仅用于文件名扩展。例如,在 case 语句中:
case $file in
*.jpg ) do something with jpg file
;;
*.gif ) do something with gif file
;;
* ) fallback case
;;
esac
glob
POSIX 定义了两个名为和的 C 库函数fnmatch
,分别执行文件名扩展和模式匹配。它们之间存在一些差异。 (Shell 实现不一定使用这些函数,而是实现它们自己的模式匹配和文件扩展。)