ブログ

bashでオプションを解析する方法

at_shiita.ishigaki
2022年3月31日 8時42分

bashでオプションを解析する方法としてgetoptsコマンドがあります。
例として以下のtest.shを使用します。

[armadillo ~]# cat test.sh
#!/bin/bash
while getopts ab OPT
do
    case $OPT in
        a) echo selected a
           ;;
        b) echo selected b
           ;;
    esac
done

getoptsコマンドでは、getoptsに続く文字がオプションとして認識され、各case文が実行されます。
実行例を以下に示します。

[armadillo ~]# ./test.sh -a
selected a
[armadillo ~]# ./test.sh -a -b
selected a
selected b
[armadillo ~]# ./test.sh -z
Illegal option -z

オプションにない文字をオプションに与えた場合、先ほどの例だと

Illegal option

と表示されましたが、case文にクエスチョンマークを追加することでオプションにない文字に対しても処理を行うことができます。

[armadillo ~]# cat test2.sh
#!/bin/bash
while getopts ab OPT
do
    case $OPT in
        a)  echo selected a
           ;;
        b)  echo selected b
           ;;
        \?) echo error #追加
           ;;
    esac
done
 
[armadillo ~]# ./test2.sh -z
Illegal option -z
error

getoptsコマンドのエラー文を表示しないようにするには、二通りの方法があります。
一つはオプションの前に:(コロン)を付ける方法、もう一つはOPTERR変数に0を代入する方法です。

[armadillo ~]# cat test3.sh
#!/bin/bash
OPTERR=0 #追加
while getopts :ab OPT # :(コロン)追加
#追加するのはどちらか一方のみで十分です。
do
    case $OPT in
        a)  echo selected a
            ;;
        b)  echo selected b
            ;;
        \?) echo error
            ;;
    esac
done
 
[armadillo ~]# ./test3.sh -z
error

オプションで引数を取る場合は、引数の後に: (コロン)を入力します。

[armadillo:~#] cat test4.sh 
#!/bin/bash
while getopts a:b OPT #aのあとに : (コロン) を追加
do
    case $OPT in
        a) echo selected a
           echo $OPTARG
           ;;
        b) echo selected b
           ;;
        \?) echo error
           ;;
    esac
done
 
[armadillo ~]# ./test4.sh -a hoge
selected a
hoge