检查参数是否与包含两个可能值的正则表达式不匹配?

3

以下是我在其中一个bash脚本中想要实现的内容。

如果SERVER_ENV不是PRODTEST,则该脚本必须退出。

check-server-env() {
  local SERVER_ENV="$1"
  if ! [[ "$SERVER_ENV"^^ =~ ^(TEST|PROD)$ ]]; then
    error "$(highlight "$SERVER_ENV")" " does not exist."
    echo "Exiting script..."
    echo ""
    exit 0
  fi
}

我运行script.sh TEST

SERVER_ENV=$1

check-server-env $SERVER_ENV

这是我的调用方式,但它没有起作用。我做错了什么?


1
正则表达式不是必需的。你可以直接使用 if [ "$SERVER_ENV" != TEST ] && [ "$SERVER_ENV" != PROD ]; then ... - Shane Bishop
2
@ShaneBishop 我猜这样也可以。但我想用正则表达式来做。谢谢! - cbdeveloper
2
正如@anubhava所指出的那样,在bash中将字符串转换为大写的方法是错误的。正确的方法是${SERVER_ENV^^}(注意{})。 - Shane Bishop
1
错误答案链接到了重复问题,投票要求重新开放。 - anubhava
3
我不明白“regex”标签被移除的理由。如果提问者需要正则表达式帮助,把它放在问题中有什么问题吗?请翻译此内容。 - anubhava
显示剩余4条评论
2个回答

6

您可以使用:

check-server-env() {
  local SERVER_ENV="$1"

  if [[ ! "${SERVER_ENV^^}" =~ ^(TEST|PROD)$ ]]; then
    error "$(highlight "$SERVER_ENV")" " does not exist."
    echo "Exiting script..."
    echo ""
    exit 0
  fi
}

然而,您可以放弃使用正则表达式并在bash中使用extglob匹配:

check-server-env() {
  local SERVER_ENV="$1"

  if [[ "${SERVER_ENV^^}" != @(TEST|PROD) ]]; then
    error "$(highlight "$SERVER_ENV")" " does not exist."
    echo "Exiting script..."
    echo ""
    exit 0
  fi
}

1
为什么要使用正则表达式呢?
if [ "${SERVER_ENV^^}" != "PROD" ] && [ "${SERVER_ENV^^}" != "TEST" ]; then
    error "$(highlight "$SERVER_ENV")" " does not exist."
    echo "Exiting script..."
    echo ""
    exit 0
fi

这个条件不符合原帖作者所期望的逻辑。 - Shane Bishop
@ShaneBishop 谢谢你捕捉到了,已修复! - MonkeyZeus
还没有修正 - 你需要&&。引用原作者的话: "如果SERVER_ENV不是PROD或TEST,脚本必须退出"。这里英语使用了模棱两可的表达方式, 但是在这种情况下, 英语中的 "not ... or" 翻译成 bash 中的 &&, 这是由于德·摩根定律所导致的。(这个英语句子翻译成 "不是(x 或者 y)", 德·摩根定律将其翻译为 "(不是x) 并且 (不是y)")。 - Shane Bishop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接