【问题标题】:What does the curly-brace syntax ${var%.*} mean?花括号语法 ${var%.*} 是什么意思?
【发布时间】:2012-03-22 11:20:36
【问题描述】:

我在查看我的一些旧代码时遇到了这种语法:

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

我发现搜索的唯一信息是指命令列表,但这只是一个变量。 这个大括号语法在 bash 中是什么意思?

【问题讨论】:

标签: bash syntax


【解决方案1】:

在这种情况下,它是parameter substitution

${variable%.*} 表示法表示取 $variable 的值,从值的尾部去掉模式 .*(助记符:percentT 在尾部有一个“t”)并给出结果。 (相比之下,${variable#xyz} 表示从变量值的头部删除 xyz — 助记符:哈希在头部有一个 'h'。)

给定:

downloadFileName=abc.tar.gz

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

extractDir="abc.tar-tmp"

% 的替代表示法:

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

将产生相当于:

extractDir="abc-tmp"

%% 表示删除可能最长的尾巴;相应地,## 表示删除最长的匹配头。

【讨论】:

  • @Shane:你确定吗?在巴什?我在 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 吗?
  • 在 Zsh(不是 Bash)中,这些也可以嵌套(即 ${${downloadFilename#abc.}%.gz} 产生“tar”)。感谢@JonathanLeffler 的收获。
  • 你的例子不太对。 > downloadFileName=abc.tar.gz > echo ${downloadFileName} abc.tar.gz > echo ${downloadFileName%.*} abc.tar > echo ${downloadFileName%%.*} abc
  • @Declan:谢谢——你是对的,示例材料没有像应有的那样清晰。我希望这些更改现在能更清楚地说明。
【解决方案2】:

表示会出现parameter expansion

【讨论】:

    【解决方案3】:

    当扩展一个环境变量与一些不是变量的文本相邻时使用它,因此shell不会将其全部包含在变量名中。

    【讨论】:

    • 这忽略了几点:(1)符号也与普通变量一起使用——不仅环境变量使用符号; (2) % 等具有特殊意义——它不是变量名的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2012-03-30
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多