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

时间:2016-03-16 13:06:09

标签: linux bash shell

请解释以下语法:

  i##*.

  i%.*   

我理解它在做什么,但我想知道一般模式(为什么/如何做到这一点)。

出现的代码:

#!/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 .

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

2 个答案:

答案 0 :(得分:2)

请参阅man bash中的参数扩展

   ${parameter#word}
   ${parameter##word}
     

删除匹配的前缀模式。这个词被扩展为产生一种模式                 在路径名扩展中。如果模式匹配值的开头                 参数,然后扩展的结果是参数的扩展值                 使用最短匹配模式(#情况)或最长匹配模式(##情况)删除。如果参数是@或*,则删除模式                 操作依次应用于每个位置参数,并且扩展为                 结果清单。如果参数是使用@或*下标的数组变量,                 模式删除操作依次应用于数组的每个成员,                 并且扩展是结果列表。

  ${parameter%word}
  ${parameter%%word}
     

删除匹配的后缀模式。这个词被扩展为产生一种模式                 在路径名扩展中。如果模式匹配的尾随部分                 扩展参数值,然后扩展的结果是扩展的                 具有最短匹配模式的参数值(%情况)或                 删除了最长匹配模式(%%个案例)。如果参数是@或*,                 模式删除操作依次应用于每个位置参数,                 并且扩展是结果列表。如果参数是数组变量                 用@或*下标,模式删除操作应用于每个mem-                 反过来,数组的ber,扩展是结果列表。

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

答案 1 :(得分:0)

this manual中查找“子字符串删除”部分:

${string##substring}
     

$substring前面删除$string的最长匹配。

${string%substring}
     

$substring后面删除$string的最短匹配。