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
我正在为 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}" ]]
#!/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