在网上查找如何获取文件的扩展名和名称时,我发现:
filename=$(basename "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}
什么是
${}
语法。。。?我知道正则表达式,但却无法理解。另外,以下两者之间的区别是什么:
filename=$(basename "$fullfile")
以及
filename=`basename "$fullfile"`
...?
在谷歌搜索是一个噩梦,因为奇怪的字符。。。
最佳答案
表达式是参数扩展(“parameters”是其他语言称之为“variables”的shell特性的技术名称)。Plain${filename##*.}
是名为${varname}
的参数的值,如果这就是您要做的一切,您可以去掉花括号,只需放置varname
。但是如果你把大括号放在那里,你可以把其他东西放在名字后面,来修改结果。$varname
和#
是一些最基本的修饰符-它们删除与通配符模式匹配的字符串的前缀或后缀。%
从开头删除,从结尾删除;在每种情况下,符号的单个实例删除最短匹配字符串,而双符号匹配最长字符串。因此#
是“删除了从开始到最后一个句点的所有内容的filename值”,而%
是“删除了从最后一个句点到结束的所有内容的filename值”。
backticks语法(${filename##*.}
)是Bourne shell中进行命令替换的原始方法,后来被Perl和Ruby等语言借用,以合并对系统命令的调用。但它对嵌套处理得并不好,它甚至试图允许嵌套意味着引用在它们内部的工作方式不同,这一切都非常令人困惑。最新的${filename%.*}
语法最初是在Korn shell中引入的,随后被Bash和zsh采用,并由POSIX编码,它允许引用在嵌套替换的所有级别上都起相同的作用,并使`...`
参数扩展具有良好的对称性。
关于bash - bash中的“extension =” $ {filename ## *。}””如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35666019/