使用正则表达式和[[]]解析OPTARG内部情况

时间:2014-01-09 20:37:03

标签: 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]$" ]]
            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无效?

2 个答案:

答案 0 :(得分:2)

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

更改为

if ! [[ "$RMPI" =~ ^[yn]$ ]]

查看以下帖子了解更多详情,

bash regex with quotes?

答案 1 :(得分:0)

为什么你在这里需要正则表达式? -M y-M n不同,是吗?所以你肯定会使用一些陈述(caseif)来区分彼此。

#!/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