Regex 使用正则表达式和[[]]和#x27解析OPTARG内部大小写;s

Regex 使用正则表达式和[[]]和#x27解析OPTARG内部大小写;s,regex,bash,getopts,Regex,Bash,Getopts,因此,我正在设置一个bash脚本,并希望使用getopts将参数解析为某些标志。对于一个极小的例子,考虑一个具有标志-m的脚本,它以y或n作为参数。如果我使用以下代码: #!/bin/bash # minimalExample.sh while getopts "M:" OPTION; do case ${OPTION} in M) RMPI=${OPTARG} if ! [[ "$RMPI" =~ "^[yn]$" ]]

因此,我正在设置一个bash脚本,并希望使用getopts将参数解析为某些标志。对于一个极小的例子,考虑一个具有标志-m的脚本,它以y或n作为参数。如果我使用以下代码:

#!/bin/bash

# minimalExample.sh

while getopts "M:" OPTION;
do
case ${OPTION} in
        M)  
            RMPI=${OPTARG}
            if ! [[ "$RMPI" =~ "^[yn]$" ]]
            then
                echo "-M must be followed by either y or n."
                exit 1
            fi
            ;;
esac
done
我得到以下信息:

$ ./minimalExample.sh -M y
-M must be followed by either y or n.
FAIL: 1
但是,如果我使用以下代码

#!/bin/bash

# minimalExample2.sh

while getopts "M:" OPTION;
do
case ${OPTION} in
        M)  
            RMPI=${OPTARG}
            if [ -z $(echo $RMPI | grep -E "^[yn]$") ]
            then
                echo "-M must be followed by either y or n."
                exit 1
                            else
                                    echo "good"
            fi
            ;;
esac
done
我得到:

$ ./minimalExample2.sh -M y
good

为什么minimalExample.sh不起作用?

在此上下文中引用regexp会强制进行字符串比较

改为

if ! [[ "$RMPI" =~ ^[yn]$ ]]
查看以下帖子了解更多详细信息


为什么这里需要正则表达式<代码>-my与
-mn
不同,是吗?因此,您肯定会使用一些语句(
case
if
)来区分两者

#!/bin/bash

while getopts "M:" OPTION; do
    case ${OPTION} in
            M)  
                case ${OPTARG} in
                    y) 
                        # do what must be done if -M y
                        ;;
                    n) 
                        # do what must be done if -M n 
                        ;;
                    *) 
                        echo >&2 "-M must be followed by either y or n."
                        exit 1
                        ;;
                ;;
    esac
done

请注意
&2
–错误消息应该输出到
STDERR
,而不是
STDOUT

,可能是因为在代码中的这一点上,他只是验证
RMPI
的值,而
y
n
的特定值直到以后才使用。@chepner完全正确。脚本开头的case控件更适合于参数验证。