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