シェルスクリプトオプションの処理に役立つ必要があります。

シェルスクリプトオプションの処理に役立つ必要があります。

次のように動作するようにスクリプトを取得しようとしています。

  • ./script -abこのようなオプションを渡したいです。./script -a -b
  • 次のようなロジックがあります。
  • また、スクリプトがオプションなしで呼び出されると、スクリプトを関数(ヘルパー関数など)に置き換えることを望みます。

ここにいくつかの例があります。

#!/usr/bin/env bash

if [[ ${#} -eq 0 ]]; then
    echo "Default function"
else
    while getopts ":a:b:c:" opt; do
        case ${opt} in
        a) echo "a" ;;
        b) echo "b" ;;
        c) echo "c" ;;
        *) echo -e "Invalid option: ${@}" ;;
        esac
    done
fi

助けてくれてありがとう。

ベストアンサー1

最も簡単なアプローチは、おそらく各オプションのフラグを設定し、ループの後にAとBの両方のフラグが設定されていることを確認し、そうであればCを有効にすることです。

ただし、これをビットマップとしてモデル化できます。ここで、AとBはそれぞれ1ビット、Cは両方のビットがセットされている状態です。したがって、A = 01、B = 10、C = 11に両方のビットがクリアされた基本状態を加えたものです。 (これらの状態は、10進数または16進数のデフォルト値= 0、A = 1、B = 2、C = 3に対応します。)その後、オプションが表示されたら、適切なビットを設定するだけです。

このように:

#!/usr/bin/env bash

mode=0
while getopts "abc" opt; do
    case ${opt} in
        a) mode=$(( mode | 0x01 )) ;; # set rightmost bit
        b) mode=$(( mode | 0x02 )) ;; # set leftmost bit
        c) mode=$(( mode | 0x03 )) ;; # set both bits
        *) exit 1 ;;
    esac
done

echo "chosen mode is $mode (0 = default, 1 = a, 2 = b, 3 = c)"

テキストにandを言及しましたが、-Aスクリプトにはandがあります。大文字と小文字を気にして同じではありません。また、コロンはオプションが引数を受け入れることを示していますが、必要ではないようです。-babgetoptsgetopts a:b:c:

おすすめ記事