我正在尝试执行参数替换,删除从第一个-
字符到字符串末尾的所有内容,如下所示: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%%-*}