我正在回顾一些旧代码,发现了这个语法:
extractDir="${downloadFileName%.*}-tmp"
我在搜索中找到的唯一信息是关于命令列表的,但这只是一个变量。在bash中,这个花括号语法是什么意思?
${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"
downloadFileName=abc.tar.gz; echo ${${downloadFileName#abc.}%.gz}
生成:bash-4.3: ${${downloadFileName#abc.}%.gz}: bad substitution
。你能指定哪个平台和哪个版本的Bash吗? - Jonathan Leffler> downloadFileName=abc.tar.gz
> echo ${downloadFileName}
abc.tar.gz> echo ${downloadFileName%.*}
abc.tar> echo ${downloadFileName%%.*}
abc - Declan当在某些非变量文本旁扩展环境变量时,它被用于使shell不将所有文本都包含在变量名中。
%
等符号具有特殊意义,它们不是变量名的一部分。 - Jonathan Leffler
$
符号之前时,它们代表另外一种含义。) - user166390