请解释以下语法:
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)
有人还请建议,我可以从哪里找到这些特殊的语法形式?
参见参数扩展在man bash
:
Run Code Online (Sandbox Code Playgroud)${parameter#word} ${parameter##word}
删除匹配的前缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(
#
案例)或最长匹配模式(##
案例)的参数的扩展值。如果参数为@或*,则依次对每个位置参数应用模式移除操作,扩展为结果列表。如果参数是一个带有@或*下标的数组变量,则模式移除操作依次应用于数组的每个成员,扩展为结果列表。Run Code Online (Sandbox Code Playgroud)${parameter%word} ${parameter%%word}
删除匹配的后缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配参数扩展值的尾部部分,则扩展的结果是参数扩展值与最短匹配模式(
%
案例)或最长匹配模式(%%
案例)删除。如果参数为@或*,则依次对每个位置参数应用模式移除操作,扩展为结果列表。如果参数是一个带有@或*下标的数组变量,则模式移除操作依次应用于数组的每个成员,扩展为结果列表。
简而言之,#
从左边移除模式,%
从右边移除模式,将符号加倍使匹配变得贪婪。(助记符:在大多数键盘#
的左侧%
)。
归档时间: |
|
查看次数: |
1605 次 |
最近记录: |