在参数替换中正确使用 $ 原子

在参数替换中正确使用 $ 原子

我正在尝试执行参数替换,删除从第一个-字符到字符串末尾的所有内容,如下所示:v0.1-bla-hblah-232 -> v0.1

所以我使用以下脚本:

#!/usr/bin/env bash
project_version=$(git describe --tags --long)
clean_version=${project_version%-$}
echo "$project_version"
echo "$clean_version"

如果我运行这个,它不起作用:

test λ ./revisioncount.sh
v0.1-2-g2ff1e73
v0.1-2-g2ff1e73

似乎$bash 没有拾取该原子。反斜杠也不起作用:\$.

现在,如果我将替换行更改为:

clean_version=${project_version%%-*}

然后它就起作用了:

test λ ./revisioncount.sh
v0.1-2-g2ff1e73
v0.1

如何使用$(匹配字符串末尾)来达到预期的效果?

答案1

clean_version=${project_version%%-*}

正如您所发现的,这是正确的使用方式。

%%%匹配于结尾根据定义,所以不需要像$最后说“匹配”这样的锚点。

供开头参考#和匹配。##

有趣的案例是/扩展,它默认匹配任何地方。这里的第一的字符是#%强制模式在开始或结束处匹配。

答案2

bash 习惯用法${var%%pattern}使用模式,而不是正则表达式。

在模式中,a 的.*含义与您想要的“任何事物”不同。
事实上,简单的*确实匹配模式中任何字符的运行。

此外,%匹配的类型(根据其本身的性质)由 分隔$

所以这:

echo ${project_version%%-*}

将匹配最长的匹配(%%而不是%破折号(-),后跟任意字符,直到内部字符串的末尾project_version

那么正确的分配将是:

clean_version=${project_version%%-*}

相关内容