順序が指定されていない場合、bashスクリプトでオプションのパラメータを解析する方法は?

順序が指定されていない場合、bashスクリプトでオプションのパラメータを解析する方法は?

次のプログラムのbashスクリプトを作成するときに、オプションのパラメータ/フラグを含める方法は混乱します。

このプログラムには2つのパラメータが必要です。

run_program --flag1 <value> --flag2 <value>

しかし、次のようないくつかのオプションのフラグがあります。

run_program --flag1 <value> --flag2 <value> --optflag1 <value> --optflag2 <value> --optflag3 <value> --optflag4 <value> --optflag5 <value> 

ユーザーパラメータを受け入れるようにbashスクリプトを実行したいと思います。ユーザーが2つのパラメータのみを順番に入力すると、次のようになります。

#!/bin/sh

run_program --flag1 $1 --flag2 $2

しかし、オプションのパラメータが含まれている場合はどうなりますか?私の考えではそうだと思います。

if [ --optflag1 "$3" ]; then
    run_program --flag1 $1 --flag2 $2 --optflag1 $3
fi

しかし、3ドルの代わりに4ドルを受け取ったらどうでしょうか?

ベストアンサー1

この記事2つの異なるアプローチshiftが示されていますgetopts(そして2つのアプローチの長所と短所について説明します)。

shiftスクリプトを使用して表示$1、実行する操作を決定し、実行、shift移動$2$1移動$3など$2を実行します。

たとえば、

while :; do
    case $1 in
        -a|--flag1) flag1="SET"            
        ;;
        -b|--flag2) flag2="SET"            
        ;;
        -c|--optflag1) optflag1="SET"            
        ;;
        -d|--optflag2) optflag2="SET"            
        ;;
        -e|--optflag3) optflag3="SET"            
        ;;
        *) break
    esac
    shift
done

getopts式で(短い)オプションを定義できますwhile

while getopts abcde opt; do
    case $opt in
        a) flag1="SET"
        ;;
        b) flag2="SET"
        ;;
        c) optflag1="SET"
        ;;
        d) optflag2="SET"
        ;;
        e) optflag3="SET"
        ;;
    esac
done

明らかに、これは単なるコードスニペットなので、検証を省略しました。必須パラメータ flag1 と flag2 が設定されていることを確認するなどです。

どの方法を使用するかは、好みによって異なります。つまり、スクリプトの移植性が欲しいのか、短いオプション(POSIX)のみを許可するのか、長いオプション(GNU)が欲しいのかなどです。

おすすめ記事