0

そのため、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のですか?

4

2 に答える 2

2

このコンテキストで正規表現を引用すると、文字列の比較が強制されます。

への変更

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

詳細については、次の投稿を確認してください。

引用符付きのbash正規表現?

于 2014-01-09T21:14:59.403 に答える
0

なぜここで正規表現が必要なのですか? -M yと同じではありません-M nね。したがって、間違いなく何らかのステートメント (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

于 2014-01-09T22:31:06.267 に答える