花括号语法 ${var%.*} 的意思是什么?(涉及IT技术)

28

我正在回顾一些旧代码,发现了这个语法:

extractDir="${downloadFileName%.*}-tmp"

我在搜索中找到的唯一信息是关于命令列表的,但这只是一个变量。在bash中,这个花括号语法是什么意思?


5
BASH参考手册的全面介绍开始...... 这个概念在参数扩展中有涉及。(当花括号没有在$符号之前时,它们代表另外一种含义。) - user166390
3个回答

67
在这个上下文中,它是一个参数替换${variable%.*}表示获取$variable的值,从该值的尾部删除模式.* ——助记:百分号在Tail处有一个't',并给出结果。(相比之下,${variable#xyz}表示从变量值的开头移除xyz——助记:哈希标志在Head处有一个'h')。
假设:
downloadFileName=abc.tar.gz

评估extractDir="${downloadFileName%.*}-tmp"的结果相当于:

extractDir="abc.tar-tmp"

% 的替代符号:

extractDir="${downloadFileName%%.*}-tmp"

将会产生相当于:

extractDir="abc-tmp"

“%%”表示删除最长的尾部;相应地,“##”表示删除最长匹配的头部。”

@Shane:你确定吗?在Bash中?我的Mac OS X 10.10上几乎完全打了补丁的Bash 4.3(4.3.27(2))不喜欢它:downloadFileName=abc.tar.gz; echo ${${downloadFileName#abc.}%.gz}生成:bash-4.3: ${${downloadFileName#abc.}%.gz}: bad substitution。你能指定哪个平台和哪个版本的Bash吗? - Jonathan Leffler
在Zsh(而不是Bash)中,这些也可以嵌套(即${${downloadFilename#abc.}%.gz}会产生"tar")。感谢@JonathanLeffler指出。 - Shane
你的例子不太对。> downloadFileName=abc.tar.gz> echo ${downloadFileName} abc.tar.gz> echo ${downloadFileName%.*} abc.tar> echo ${downloadFileName%%.*} abc - Declan
@Declan:谢谢你,你是对的,例子材料没有应该有的那么清晰。我希望这些更改现在能让它更加清晰。 - Jonathan Leffler

5

-1

当在某些非变量文本旁扩展环境变量时,它被用于使shell不将所有文本都包含在变量名中。


这个说法忽略了几个要点:(1) 这种符号也用于普通变量,不仅是环境变量使用这种符号;(2) % 等符号具有特殊意义,它们不是变量名的一部分。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接