shell 参数名称后带有磅和百分号的语法

Sky*_*094 3 linux bash shell

请解释以下语法:

  i##*.

  i%.*   
Run Code Online (Sandbox Code Playgroud)

我明白它在做什么,但我想知道一般模式(为什么/如何这样做)。

它出现的代码:

#!/bin/bash

recursive_name_change()
{
    cd "$1"
    for i in *
    do
        #echo "${i##*.}"
        if [ -d "$i" ]
        then
            recursive_name_change "$i"
        elif [ "${i##*.}" = "cpp" ]
        then
             new_name=${i%.*}".c"
        mv "$i" "$new_name"
        fi
        done
        cd ../
    }

recursive_name_change .
Run Code Online (Sandbox Code Playgroud)

有人还请建议,我可以从哪里找到这些特殊的语法形式?

cho*_*oba 7

参见参数扩展man bash

   ${parameter#word}
   ${parameter##word}
Run Code Online (Sandbox Code Playgroud)

删除匹配的前缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(#案例)或最长匹配模式(##案例)的参数的扩展值。如果参数为@或*,则依次对每个位置参数应用模式移除操作,扩展为结果列表。如果参数是一个带有@或*下标的数组变量,则模式移除操作依次应用于数组的每个成员,扩展为结果列表。

  ${parameter%word}
  ${parameter%%word}
Run Code Online (Sandbox Code Playgroud)

删除匹配的后缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配参数扩展值的尾部部分,则扩展的结果是参数扩展值与最短匹配模式(%案例)或最长匹配模式(%%案例)删除。如果参数为@或*,则依次对每个位置参数应用模式移除操作,扩展为结果列表。如果参数是一个带有@或*下标的数组变量,则模式移除操作依次应用于数组的每个成员,扩展为结果列表。

简而言之,#从左边移除模式,%从右边移除模式,将符号加倍使匹配变得贪婪。(助记符:在大多数键盘#的左侧%)。