请解释以下语法:
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 .
也有人建议,我从哪里可以找到这些特殊的语法形式?
参见 参数扩展 在man bash:
man bash
${parameter#word} ${parameter##word} 删除匹配的前缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(#情况)或最长匹配模式(##情况)的参数的扩展值。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。 ${parameter%word} ${parameter%%word} 删除匹配的后缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式(%情况)或最长匹配模式(%%情况)删除。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展名是结果列表。
${parameter#word} ${parameter##word}
删除匹配的前缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(#情况)或最长匹配模式(##情况)的参数的扩展值。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。
#
##
${parameter%word} ${parameter%%word}
删除匹配的后缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式(%情况)或最长匹配模式(%%情况)删除。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展名是结果列表。
%
%%
简而言之,#从左侧删除图案,%从右侧删除图案,将符号加倍会使匹配的贪婪。(助记符:在大多数键盘上#位于左侧%)。