IF 语句中的正则表达式未正确评估 BASH

Regex in IF statement not evaluated propertly BASH

我正在为 bash 中的这个简单陈述而苦苦挣扎:

基本上我希望仅当 OPTION1 为“yes”或 1 且 OPTION2 不同于“yes or 1”时 echo 才显示消息

问题在于,即使 OPTION2 为空字符串,也会被评估为 TRUE。

#!/bin/bash

OPTION1="YES"
OPTION2=""

if [[ "${OPTION1}" =~ ^[Ys][Es][Ss]|[1] ]] && [[ ! "${OPTION2}" =~ ^[Yy][Ee][Ss]|[1] ]];then
    echo "EXECUTED"
fi

如果 OPTION2 为空字符串,我如何修改它以使 if 语句失败?

您可以使用 [[ ! -z "${OPTION2}" ]]

检查 OPTION2 是否为空字符串
#!/bin/bash

OPTION1="YES"
OPTION2=""

if [[ "${OPTION1}" =~ ^[Ys][Es][Ss]|[1] ]] && [[ ! -z "${OPTION2}" ]] && [[ ! "${OPTION2}" =~ ^[Ys][Ee][Ys]|[1] ]];then
    echo "EXECUTED"
fi

问题是,如果$OPTION2为空,则匹配失败,而!则使整个测试成功。将空字符串的测试添加到 RE:

#!/usr/bin/env bash

# Turn on case-insensitive matching to tidy up the REs
shopt -s nocasematch

OPTION1="YES"
OPTION2=""

if [[ "${OPTION1}" =~ ^(yes|1)$ ]] && [[ ! "${OPTION2}" =~ ^(yes|1|)$ ]]; then
    echo "EXECUTED"
else
    echo "NOT EXECUTED"
fi

或者,如果 $OPTION2 为空,则展开一个与正则表达式匹配的值:

if [[ "${OPTION1}" =~ ^(yes|1)$ ]] && [[ ! "${OPTION2:-yes}" =~ ^(yes|1)$ ]]; then
    echo "EXECUTED"
else
    echo "NOT EXECUTED"
fi