![Bash:在进行匹配的参数扩展上下文中“模式匹配”和“文件名扩展”之间的区别](https://linux22.com/image/221974/Bash%EF%BC%9A%E5%9C%A8%E8%BF%9B%E8%A1%8C%E5%8C%B9%E9%85%8D%E7%9A%84%E5%8F%82%E6%95%B0%E6%89%A9%E5%B1%95%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%AD%E2%80%9C%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E2%80%9D%E5%92%8C%E2%80%9C%E6%96%87%E4%BB%B6%E5%90%8D%E6%89%A9%E5%B1%95%E2%80%9D%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
编辑:戈登·戴维森的评论回答了问题
我正在阅读 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 实现不一定使用这些函数,而是实现它们自己的模式匹配和文件扩展。)