オプションのパラメータは必須パラメータの後ですか、前ですか?

オプションのパラメータは必須パラメータの後ですか、前ですか?

シェルスクリプトを作成していますが、2つの必須パラメータと1つのオプションパラメータを受け入れる必要があります。どうやって確認しますか?私が見たほとんどのスクリプトでは、オプションのパラメータが必須パラメータの前に渡されます。たとえば、次のようになります。

cut -c2 test.txt

しかし、私の考えでは、このパターンをスクリプトで確認するのは複雑なので、3番目のパラメータをオプションとして扱うことをお勧めします。

答え1

最後のオプションのパラメータに同意すると、次のことができます。

foo=$1
bar=$2
baz=${3:-default value}

これにより、最初の2つのパラメータが$foosumに保存されます$bar。 3番目の引数が指定された場合は保存され、$bazそれ以外の場合はデフォルト値になりますdefault value。 3番目の変数が空であることを確認することもできます。

if [ -z "$3" ]; then
    # Code for the case that the user didn't pass a third argument
fi

最初からデフォルト値を使用したい場合は、最も簡単な方法は$#

case $# in
  2)
    # Put commands here for when the user passes two arguments
    # Could just be setting variables like above, or anything else you need
    ;;
  3)
    # Put commands here for when the user passes three arguments
    ;;
  *)
    echo "Wrong number of arguments passed"
    exit 1;;
esac

エラーチェックが必要な場合は、$#どちらの場合もオープンが正常に機能します。スクリプトが例のようにgetoptスタイルパラメータを使用している場合は、これを使用できますcutこのスタックオーバーフローの質問より多くの情報を知りたい場合

答え2

必須パラメータとオプションのパラメータ、オプションとオペランドという2つの概念があります。オプションはで始まる引数で、-オペランドはで始まらない引数であり、-オプションの引数ではありません。オプションは名前で識別され、通常は任意の順序でソートできます。オペランドはその位置で識別されます。だから

someprogram -a -z -c foo bar

3つのオプション-a-cとが-zあり、2つのオペランドがあります。最初のものは、foo2番目はですbar

オプションは通常オペランドの前にあります。 GNUプログラムは順序を気にしない傾向がありますが、GNU以外のほとんどのプログラムは、引数の前に-他のオペランドがある場合はオペランドで始まる引数を処理します。オプション(グループ化など)にはさまざまなバリエーションがありますが、--ここでは扱いません。

プログラムが2つの必須オペランドと3番目のオプションのオペランドを使用する場合、自然な方法は、1番目と2番目の必須オペランドを持ち、3番目のオペランドがある場合はオプションのオペランドになることです。

シェルスクリプトでは、パラメータは、"$1"などです"$2""$3"パラメータの数はです$#。スクリプトがオプションを認識しない場合は、オプションの検出を省略してすべての引数をオペランドとして扱うことができます。バラよりマイケル・モロジェクの回答サンプルコードオプションが認識されたい場合は、組み込みgetoptsオプションを使用してください(例についてはシェルのドキュメントを参照してください)。

答え3

オプションのパラメータを最初に置く1つの方法はを使用することですshift
すべてのパラメータをnステップ左に移動し、以下のパラメータを削除します$1。引数が指定されない場合、shiftステップ数は 1 です。

スクリプトの先頭で、最初の引数がオプションの引数または最初の必須引数の構造と一致することを確認します。
これが必要な場合は何もしません。
オプションの場合は、それを処理して電話することができますshift

ここで役に立つのは、オプションのパラメータが指定されているかどうかにかかわらず、必須パラメータ(3つがあると仮定)が常に$1toにあることです。$3 後ろにオプションのパラメータを処理するブロックです。

関連情報