【问题标题】:What is the value of ${variable%rc*}?${variable%rc*} 的值是多少?
【发布时间】:2015-07-06 09:36:40
【问题描述】:

我遇到过这个奇怪的 bash 表达式:

somestring=4.5.6
echo ${somestring%rc*}

据我所知,它只打印4.5.6。那么为什么会有人使用它呢?

我在 this 脚本中找到了它(查找 pkgver),所以我希望我没有错过任何必要的上下文。

【问题讨论】:

标签: string bash


【解决方案1】:

Source:

${string%substring} 从后面删除$substring 的最短匹配 $string.

目的是仅回显数字版本,不带 rc* 后缀的字符串,例如:

somestring=4.5.6rc1
somestring=4.5.6rc23_whatever

更新:
更好的选择是 echo ${somestring%%rc*}
否则,可能会发生以下情况:

somestring=4.5.6rc1_rc2
echo ${somestring%rc*}
4.5.6rc1_

而:

echo ${somestring%%rc*}
4.5.6

【讨论】:

    【解决方案2】:

    它从somestring 中删除rc 和任何后续字符(*)。参见,例如,this answer

    【讨论】:

      【解决方案3】:

      这称为参数扩展。

      来自Bash manual

      ${parameter%word}

      ${参数%%word}

      单词被扩展以产生一个模式,就像在文件名扩展中一样。如果模式匹配扩展的尾随部分 参数的值,那么展开的结果就是 具有最短匹配模式的参数(“%”案例)或 最长匹配模式(“%%”案例)已删除。如果参数是'@' 或“”,模式移除操作应用于每个位置 依次参数,展开是结果列表。如果 参数是一个以‘@’或‘’为下标的数组变量, 模式移除操作应用于数组的每个成员 转,展开就是结果列表。


      简单地说,"${somestring%rc*}" 是通过从右侧的 $somestring 剪切 rc** 表示 rc 之后的任何内容)留下的字符串,即 rc* 在右侧的字符串中匹配,然后删除,结果是剩余的细绳。

      【讨论】:

        猜你喜欢
        • 2012-04-08
        • 2015-09-02
        • 2011-01-24
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        相关资源
        最近更新 更多