次のように動作するようにスクリプトを取得しようとしています。
./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があります。大文字と小文字を気にして同じではありません。また、コロンはオプションが引数を受け入れることを示していますが、必要ではないようです。-b
a
b
getopts
getopts a:b:c: