【发布时间】:2021-08-24 03:58:51
【问题描述】:
我有一个带有 bash if 语句的 GitLab 工作,看起来像这样
script:
- echo $NEW_VERSION
- export STAGE=staging
- |-
if [[ $(expr match "$NEW_VERSION", '([0-9]+)\.([0-9]+)\.([0-9]+)$') != 0 ]]; then
export STAGE=production;
fi
- echo $STAGE
变量$NEW_VERSION 来自上一步。此变量的内容是语义版本字符串,如1.0.0 或1.0.1-develop.1。如果此变量是预发布版本(它包含开发后缀),我想将$STAGE 设置为暂存,否则设置为production。
我的问题是,无论$NEW_VERSION 变量有哪些内容,$STAGE 总是设置为暂存。
如果我在本地 Mac 上执行脚本,则值设置正确。
这里是日志输出:
$ echo $NEW_VERSION
11.0.0
$ export STAGE=staging
$ if [[ $(expr match "$NEW_VERSION", '([0-9]+)\.([0-9]+)\.([0-9]+)$') != 0 ]]; then # collapsed multi-line command
staging
有没有人遇到过类似的问题或知道为什么这个解决方案不起作用?
【问题讨论】:
-
如果您只需要匹配字符串
develop,您可以使用[[ "${NEW_VERSION}" == *develop* ]]或[[ "${NEW_VERSION}" =~ develop ]]吗? -
是的,这也是我的第一种方法,但是 bash 不存在 =~ 运算符。阅读此处了解更多信息:stackoverflow.com/a/63124383/10115037
-
bash --version返回什么? -
奇怪。它说
eval: line 120: bash: not found -
@Markus 听起来您实际上并没有在 bash 下运行,甚至没有可用的 bash。 bash 确实有
=~,它是added in version 3.0-alpha)。您链接的关于=~的答案实际上不是关于 bash,而是关于 ash 的 BusyBox 版本(显然是作为 bash 传递的?)