`extension =" $ {filename ## *。}"`如何在bash中工作?

时间:2016-02-27 05:16:32

标签: bash

在网上查看如何获取文件的扩展名和名称时,我发现:

filename=$(basename "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}

${}语法是什么......?我知道正则表达式,但"${filename##*.}""${filename%.*}无法理解。

另外,区别是:

filename=$(basename "$fullfile")

filename=`basename "$fullfile"`

...? 由于奇怪的角色......在谷歌看是一场噩梦......

2 个答案:

答案 0 :(得分:2)

正如@ e0k在对该问题的评论中所说,<select>语法是Bash&#39; parameter (variable) expansion。它有自己的语法,与正则表达式无关;它包含一系列广泛的功能,包括:

  • 指定默认值
  • 前缀和后缀剥离
  • 字符串替换
  • 子串提取

${varname...}`...`之间的区别(两者都是所谓的command substitutions的形式)是:

  • $(...)是较旧的语法(通常称为已弃用,但并非严格属实。)
  • `...`是它的现代等价物,它有助于嵌套的使用,并且在引用方面更直观。
  • 有关详细信息,请参阅here

答案 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}具有良好的对称性参数扩展。