簡単なアプローチを取り、引数を繰り返し処理して、指定されたパラメーター ( -t
、 など--therizinosaurus
) と等しいかどうかをそれぞれテストすることができます。
それを関数に入れます:
has_param() {
local term="$1"
shift
for arg; do
if [[ $arg == "$term" ]]; then
return 0
fi
done
return 1
}
…そしてそれをテスト式の述語として使用します:
if has_param '-t' "$@"; then
echo "yay!"
fi
if ! has_param '-t' "$1" "$2" "$wat"; then
echo "nay..."
fi
空の引数を拒否する場合は、ループ本体の先頭に終了ポイントを追加します。
for arg; do
if [[ -z "$arg" ]]; then
return 2
fi
# ...
これは非常に読みやすく、パターン マッチングや正規表現マッチングのように、誤検知が発生することはありません。
また、任意の位置にフラグを配置することもできます。たとえば、-h
コマンド ラインの最後に配置できます (それが良いか悪いかには関係ありません)。
が、考えれば考えるほど気になることがありました。
関数を使用すると、任意の実装 (例: getopts
) を取得して再利用できます。カプセル化ルールズ!
しかし、コマンドを使用しても、この強さは欠点になる可能性があります. 何度も使用する場合は、毎回すべての引数を解析することになります。
私の傾向は再利用を好む傾向にありますが、その意味を認識しておく必要があります。反対のアプローチは、恐れていたようにスクリプトの先頭でこれらの引数を 1 回解析し、解析の繰り返しを避けることです。
その switch ケースをカプセル化することもできます。これは、決定した大きさにすることができます (すべてのオプションをリストする必要はありません)。