在网上查看如何获取文件的扩展名和名称时,我发现:
filename=$(basename "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}
${}
语法是什么......?我知道正则表达式,但"${filename##*.}"
和"${filename%.*}
无法理解。
另外,区别是:
filename=$(basename "$fullfile")
和
filename=`basename "$fullfile"`
...? 由于奇怪的角色......在谷歌看是一场噩梦......
答案 0 :(得分:2)
正如@ e0k在对该问题的评论中所说,<select>
语法是Bash&#39; parameter (variable) expansion。它有自己的语法,与正则表达式无关;它包含一系列广泛的功能,包括:
${varname...}
和`...`
之间的区别(两者都是所谓的command substitutions的形式)是:
$(...)
是较旧的语法(通常称为已弃用,但并非严格属实。)`...`
是它的现代等价物,它有助于嵌套的使用,并且在引用方面更直观。答案 1 :(得分:2)
${filename##*.}
表达式是参数扩展(&#34;参数&#34;是其他语言调用的shell功能的技术名称&#34;变量&#34;)。简单${varname}
是名为varname
的参数的值,如果你正在做的事情,你可以不用花括号,只需放$varname
。但是如果你把花括号留在那里,你可以在名字后面加入其他东西来修改结果。 #
和%
是一些最基本的修饰符 - 它们删除与通配符模式匹配的字符串的前缀或后缀。 #
从头开始删除,%
从结尾删除;在每种情况下,符号的单个实例删除最短匹配字符串,而双符号匹配最长匹配字符串。因此,${filename##*.}
是&#34;文件名的值,从开头到最后一个句点的所有内容都已删除&#34;,而${filename%.*}
是&#34;文件名的值包含上一期间的所有内容最后删除&#34;。
反引号语法(`...`
)是在Bourne shell中执行命令替换的原始方式,并且后来被Perl和Ruby等语言借用以结合调用系统命令。但它并不能很好地处理嵌套,并且它甚至允许嵌套的尝试意味着引用在它们内部的工作方式不同,而且它们都非常令人困惑。最新的$(...)
语法,最初在Korn shell中引入,然后被Bash和zsh采用并由POSIX编写,允许在嵌套替换的所有级别上引用相同的工作,并使{{1}具有良好的对称性参数扩展。