请解释以下语法:
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 .
有人请建议,我在哪里可以找到这些特殊的语法形式?
答案 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
的最短匹配。