シェルスクリプトで『getopts』を使ってオプションの処理を行わせる

仕事などでシェルスクリプトを作っていると、引数としてオプションを付与させるようなスクリプトを作りたくなる事がある。
そういったオプション関係の処理を簡単に行えるのが、今回紹介する『getopts』コマンドだ。仕事でスクリプトを組んでいれば、一度は利用するだろう。

このコマンドを利用することで、オプションを付与させるタイプのシェルスクリプトを簡単に作成することが可能になる。
基本的には、以下の例のようにwhile、caseと組み合わせる使い方がセオリーだ。

example.sh

#!/bin/sh

##########################################
# この例では、以下のオプションを付与させる #
# -a … オプション                         #
# -b … 文字列を後に付与するオプション     #
# -c … オプション                         #
##########################################

# FLAG_A … 「-a」オプションが認識されているかどうか
# ARGS_B … 「-b」オプションで付与した文字列を格納
# FLAG_C … 「-c」オプションが認識されているかどうか
FLAG_A=0
ARGS_B=""
FLAG_C=0

# whileでgetoptsを用いる
# getoptsに引数として、使用するオプションの文字列を渡している。
# 文字列を後に付与するオプションの場合、「文字:」といった書き方をする。
while getopts "ab:c" op
do
    case $op in
        a)
          FLAG_A=1
          ;;
        b)
          # オプションに対する引数は「$OPTARG」で取得できる
          ARGS_B="$OPTARG"
          ;;
        c)
          FLAG_C=1
          ;;
        *)
          exit 1
          ;;
    esac
done

echo "指定されたオプションであれば「1」もしくは付与した文字列が表示される"
echo "-a: " $FLAG_A
echo "-b: " ${ARGS_B:="指定されませんでした"}
echo "-c: " $FLAG_C

それでは、実際に上のスクリプトを実行してみよう。

[root@test-centos7 ~]# sh /work/example.sh
指定されたオプションであれば「1」もしくは付与した文字列が表示される
-a:  0
-b:  オプションが付与されませんでした
-c:  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/example.sh -b 'aaaaa' -c
指定されたオプションであれば「1」もしくは付与した文字列が表示される
-a:  0
-b:  aaaaa
-c:  1
[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/example.sh -b -c
指定されたオプションであれば「1」もしくは付与した文字列が表示される
-a:  0
-b:  -c
-c:  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/example.sh -b
/work/example.sh: オプションには引数が必要です -- b
[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/example.sh -d
/work/example.sh: 不正なオプションです -- d

順番通りにオプションを書かなくても正常に認識されるし、不正なオプションの場合はその旨を表示してくれている。