小编典典

Shell参数名称后带有井号和百分号的语法

linux

请解释以下语法:

  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 .

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


阅读 724

收藏
2020-06-02

共1个答案

小编典典

参见 参数扩展man bash

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

删除匹配的前缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(#情况)或最长匹配模式(##情况)的参数的扩展值。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。

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

删除匹配的后缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式(%情况)或最长匹配模式(%%情况)删除。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展名是结果列表。

简而言之,#从左侧删除图案,%从右侧删除图案,将符号加倍会使匹配的贪婪。(助记符:在大多数键盘上#位于左侧%)。

2020-06-02