Bash:在进行匹配的参数扩展上下文中“模式匹配”和“文件名扩展”之间的区别

Bash:在进行匹配的参数扩展上下文中“模式匹配”和“文件名扩展”之间的区别

编辑:戈登·戴维森的评论回答了问题

我正在阅读 GNU Bash 手册,我注意到基本上有三种类型的“参数扩展”可以进行模式匹配:

  1. ${parameter#word} ${parameter##word}
  2. ${parameter%word} ${parameter%%word}
  3. ${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

globPOSIX 定义了两个名为和的 C 库函数fnmatch,分别执行文件名扩展和模式匹配。它们之间存在一些差异。 (Shell 实现不一定使用这些函数,而是实现它们自己的模式匹配和文件扩展。)

相关内容