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

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

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

  • ./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:

答え2

(問題の新しい要求を処理するために編集されます)

あなたは非常に近いです。私がしたことは次のとおりです。最初は少し複雑に見えますが、デフォルト値を設定し、コマンドラインを解析し、無効なオプション値または組み合わせを確認してから、基本ルーチンをスクリプト化する一連のステップです。

#!/usr/bin/env bash

# defaults for options
help=n
opt_a=1
opt_b=production
opt_c=0

# if no options from my user, print help message only
if [[ $# -lt 1 ]]; then help=y; fi

# parse command line
while getopts ':ha:b:c' OPTION; do
  case "${OPTION}" in
     h) help=y            ;;
     a) opt_a="${OPTARG}" ;;
     b) opt_b="${OPTARG}" ;;
     c) opt_c=1           ;;
    \?) echo "$0: Error: Invalid option: -${OPTARG}" >&2 ; exit 1 ;;
     :) echo "$0: Error: option -${OPTARG} requires an argument" >&2 ; exit 1 ;;
  esac
done
shift $((OPTIND - 1))

# request for help overrides other actions
if [[ ${help} == 'y' ]]; then
  # put code here to print a USAGE message
  exit 0
fi

# check and error out on bad options from my user
# check -b:
case "$opt_b" in
  production) ;;
     staging) ;;
          qa) ;;
           *) echo "$0: Error: unknown argument -b \"${opt_b}\", exiting" >&2 ; exit 1 ;;
esac

# script does its work starting from here

呼び出すと、予想どおりにscript-name -c -b qaオプションの合計が解決され、-b機能します。-cscript-name -cb qa

私はオプションをチェックする例だけを提示しました(答えを単純にするため)。通常、各オプションをチェックし、正当なオプションの組み合わせと違法なオプションの組み合わせに応答するコードが多くあります。私は通常、これらのコード行をサブルーチンに入れて、スクリプトの基本的なワークフローの途中にないようにします。

関連情報