【问题标题】:What is a `##` means in bash variable substitution `${}`? [duplicate]bash 变量替换 `${}` 中的`##` 是什么意思? [复制]
【发布时间】:2017-12-27 07:20:41
【问题描述】:

我在http://www.tldp.org/LDP/abs/html/index.html学习bash脚本资料 并停留在示例 7-7:

http://tldp.org/LDP/abs/html/comparison-ops.html#EX14

有一个${filename##*.} != "gz",这可能意味着 $filename 不以.gz 结尾,但我没有 在这里知道## 的含义。谁能帮帮我?

谢谢!

【问题讨论】:

  • 在你的shell中,你也可以运行man bash,然后点击正斜杠开始搜索,输入##并回车。魔法! :-D(整个“参数扩展”部分值得仔细研究。)
  • 太棒了! @ghoti

标签: bash


【解决方案1】:

在变量扩展中使用,${string##sub}string 中删除最长匹配子串sub# 通过对比删除最短匹配子串)。

在您的情况下,是的 - 这将返回文件名中第一个 . 之后的字符串,并给出文件扩展名。

如果您在 this 文档中搜索 ##,您会找到解释(以及其他类似命令)。

【讨论】:

  • 谢谢。在您的帮助下,我在tldp.org/LDP/abs/html/refcards.html#AEN22728 上找到了扩展指南。
  • @cmal 我以前没有看过 refcards 页面 - 这实际上非常非常有用,可以为它添加书签。感谢您向我展示新的东西!
【解决方案2】:

在文件名的上下文中,试图在变量文件名中查找扩展名

filename="*.log"
echo ${filename##*.}
log

我们正在获取“*”之后的字符串文件名部分。

【讨论】:

    【解决方案3】:

    ## 用于从变量中删除子字符串。欲了解更多信息,请查看this 页面。

    例如。如果filename=/home/user.name/folder.1/test.gz,那么 ${filename##*.} 会给你输出gz

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2012-04-19
      • 2021-02-11
      • 2017-03-18
      • 2011-05-22
      • 2021-05-04
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      相关资源
      最近更新 更多