-optionとパラメータを使用したシェルスクリプトの呼び出し

-optionとパラメータを使用したシェルスクリプトの呼び出し

test.sh次のようにシェルスクリプトを呼び出す必要があります。

./test.sh -run/-rerun  username password

シェルスクリプトから渡されたオプション-runやオプションがあるかどうかを確認できますか?-rerun

ベストアンサー1

一般的なアプローチは次のとおりです。getoptより簡単な解析のためにスクリプトに渡されたコマンドラインオプションを分析するユーティリティです。getoptパラメータの有無にかかわらず、短い(単一文字)および長い(多文字)オプションをサポートします。getopt呼び出し時に2つの引数が渡されます。getoptオプションの解析方法を変更するオプションと、解析する呼び出しスクリプトの引数。

残りの引数を解析する方法を指定する最も重要なオプションgetoptは次のとおりです。

  • -o, --options shortopts解析する短いオプションです。このオプションの引数はshortopts文字列であり、短いオプションとして認識する必要があります。必須パラメーターを持つオプション文字の後にはコロンが続く必要があり、オプションのパラメーターを持つオプション文字の後には2つのコロンが続く必要があり:ます::。たとえば、このshortopts文字列はab:c::次の認識されたオプションに-a対応し-b argます-c-c argこのオプションを指定しないと、次に始まらgetoptない(オプション引数でもない)最初のオプションが文字列として扱われます。-shortopts

  • -l, --longoptions longopts解析する長いオプションです。オプション名をカンマで区切って複数のオプションを一度に指定したり、-lオプションを複数回指定したりできます。必須およびオプションのパラメータは、オプション名の後または後にオプションとして-o表示されます。:::

  • -a, --alternative共同合意、特に牛に似た一種の栄養ソフトウェアの1つの欠点は、長いオプションの前に2つのダッシュ(たとえば)が付いていることです--run。この-aオプションは、getopt長いオプションが-単一文字で始まることができることを示します。

  • -q,--quietgetopt認識できないオプションを検出したり、解析する引数の中に必須の引数が欠落している場合、またはgetopt: unrecognized option '[option name]'togetopt: option '[option name'] requires an argument形式のメッセージを出力し、stderr通常の出力を生成してstdoutゼロ以外の状態で終了します。この-qオプションを使用すると、エラーメッセージが表示されないことがあります。

  • -n, --name prognamegetoptこのオプションを使用すると、上記のエラーを報告するときに使用するプログラム名を指定できます。

オプションではない最初の引数(オプション引数ではないか、上記のようにshortopts文字列として扱われます)は、getopt解析する引数リストの先頭と見なされます。これらのパラメータの先頭はとしてマークすることもできます。--この場合、最初の次のパラメータは解析する--パラメータリストの先頭と見なされます。

の一般的な出力は、getopt次のように認識されたオプションの拡張リストです。

  • 付属の短いオプション(例:)は-abc別のオプションに拡張されます-a -b -c

  • 単一のダッシュで始まる長いオプション(たとえば)-aでは、オプションとして指定されている場合は追加のダッシュが前に付けられます。つまり、getopt-foo--foo

  • オプションの必須パラメータとオプションパラメータは引用符で囲まれています(例:-b arggoesとbe)。-b 'arg'--foo arg--foo=arg--foo 'arg'

  • 残りのパラメータは引用符で囲まれ、optionsと区別されます--

拡張の利点は、考慮すべき状況が少ないため、分解されたオプションを解析する方が簡単です。getopt質問で指定されたコマンドラインオプションを使用して解析された例は次のとおりです。

#!/bin/bash

OPTS=`getopt -a -l run -l rerun -- "$0" "$@"`
if [ $? != 0 ] # There was an error parsing the options
then
  exit 1 
fi

eval set -- "$OPTS"

while true; do
  case "$1" in
    --run) echo "option --run specified"; shift;;
    --rerun) echo "option --rerun specified"; shift;;
    --) shift; break;;
  esac
done

echo "Args:" 
for arg # Process remaining arguments
do
  echo $arg
done

説明する:

OPTS=`getopt -a -l run -l rerun -- "$0" "$@"`

OPTSここでは、呼び出しの出力を保持する変数を設定しますgetopt。この場合、ここに渡されるパラメータはgetoptシェルによって設定された組み込み変数です。スクリプト名をbash保存し、スクリプトに渡されたすべてのコマンドライン引数(個別に引用)を保存します。引数は指定されたオプションに従って処理されます。この例では、パラメータのない長いオプションが認識されます。このオプションはテーブルと。呼び出しの結果は拡張パラメータのリストです。たとえば、などのスクリプト呼び出しはシェルによる呼び出しに拡張されます。拡張パラメータは順番に出力されます。$0$@getoptgetopt--run--rerun-agetopt-run-rerungetopttest.sh -run username passwordgetoptgetopt -a -l run -l rerun -- "test.sh" "-run" "username" "password"getopt--run -- 'username' 'password'


if [ $? != 0 ] # There was an error parsing the options
then
  exit 1 
fi

組み込み変数は、$?最後に実行されたコマンドの戻り値を保持します。ゼロ以外の戻り値は、getoptエラーが発生したことを示します。


eval set -- "$OPTS"

これは実際にスクリプトに渡された元のコマンドライン引数をから出力された拡張引数に置き換えますgetopt


while true; do
  case "$1" in
    --run) echo "option --run specified"; shift;;
    --rerun) echo "option --rerun specified"; shift;;
    --) shift; break;;
  esac
done

$1ループは最初の位置引数から始まり、各位置引数を順番に処理します。拡張後、getopt3つのケースを考慮するだけです。処理が終わると、各ケースは、などの位置shiftパラメータを変更します。したがって、位置パラメータはループが繰り返されるたびに新しい値を保持します。$2$1$3$2$1

処理中のオプションに必須パラメーターが必要な場合は、case位置パラメーターを使用してステートメントからパラメーター値にアクセスできます$2。オプションとその引数が処理されたときに両方のオプションを削除するには、位置パラメータを2だけ移動する必要があります。そして議論。

a が認識されたオプションの後、残りの引数の前に出力される場合getopt、ケースはオプションリストの終わりとループの終了条件を示します。----while


echo "Args:" 
for arg # Process remaining arguments
do
  echo $arg
done

for argうん、短縮for arg in "$@"whileループ後、shift各ケースの結果、出力$@後半の残りのパラメータのみが保存されます。--getopt

おすすめ記事