Getoptsを使用して複数のオプションを一緒に処理することは可能ですか?たとえば、myscript -iRまたはmyscript -irvです。
また、条件スクリプトに基づいて必須オプションが必要になる状況があります。たとえば、スクリプトへの引数がディレクトリの場合、-Rまたは-rオプションと他のオプションを指定する必要があります(myscript -iR mydirまたはmyscript -ir mydirまたはmyscript -i -r mydirまたはmyscript -i -R mydir)、ファイルの場合のみ-iで十分です(myscript -i myfile)。
検索しようとしましたが、答えが得られませんでした。
指定したオプションを連結すると、getopts
がそれらを分離します。 case
ステートメントでは、各オプションを個別に処理します。
オプションが表示されたときにフラグを設定し、getopts
ループの完了後に必須の「オプション」(!)が存在することを確認することができます。
以下に例を示します。
#!/bin/bash
rflag=false
small_r=false
big_r=false
usage () { echo "How to use"; }
options=':ij:rRvh'
while getopts $options option
do
case "$option" in
i ) i_func;;
j ) j_arg=$OPTARG;;
r ) rflag=true; small_r=true;;
R ) rflag=true; big_r=true;;
v ) v_func; other_func;;
h ) usage; exit;;
\? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
: ) echo "Missing option argument for -$OPTARG" >&2; exit 1;;
* ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
esac
done
if ((OPTIND == 1))
then
echo "No options specified"
fi
shift $((OPTIND - 1))
if (($# == 0))
then
echo "No positional arguments specified"
fi
if ! $rflag && [[ -d $1 ]]
then
echo "-r or -R must be included when a directory is specified" >&2
exit 1
fi
これはgetopts
関数の完全なリファレンス実装を表しますが、大規模なスクリプトのスケッチにすぎません。