(11)【getopts】シェルスクリプトコマンド活用紹介

getoptsコマンド

  • オプションを解析する
  • エラーメッセージを表示しない
  • 引数付きのオプションを使用する

getoptsコマンド概要

「getopts」は、bashのシェルスクリプト内でオプションを解析する際に役立つコマンドです。自作のシェルスクリプトで「-a」のような「ハイフン+アルファベット1文字」のオプションを扱う際に便利です。「-f ファイル名」のように引数を取るオプションも解析できます。

例えばこういうのです

$ head -n10

文字列を渡すこともできます

$ grep -f wordlist.txt

ということで、自作のスクリプトでこういう事ができるわけです。

$ myScript.sh -n10 -f addressList.txt
ヒント
getoptsとよく似た名前で用途も同じ「getopt」コマンド(/usr/bin/getopt)があります。getoptコマンドはgetoptsとは異なり、「–」から始まるロングオプションも扱うことができます。

getoptsコマンドの書式

getopts オプション文字列 変数名

getoptsコマンドの主なオプション

getoptsにはオプションはありません。なお、オプション文字列の先頭に「:」記号を入れるかどうかによって、エラーメッセージ表示の有無を変更できます。

オプション 意味
: エラーメッセージの表示の有無
ヒント
一覧のオプションは一部です。 $ man getopts などで、getoptsの使い方を確認してください。

getoptsコマンド詳細説明

オプションを解析する

オプション「-a」「-b」「-c」を使用し、それぞれのオプションに応じてメッセージを表示します。

#!/bin/bash

while getopts abc OPT; do
  case $OPT in
     a) echo "[-a] が指定された";;
     b) echo "[-b] が指定された";;
     c) echo "[-c] が指定された";;
     *) echo "該当なし OPT=$OPT ";;
  esac
done

while getopts abc OPT; do
の abc は、オプションの種類が a,b,cの3種類あることを明示的に指定しています。
OPTは $OPT変数で、 a,b,cがそれぞれ順に代入されます。

$ bash getopts.sh -a
[-a] が指定された
$ bash getopts.sh -ab
[-a] が指定された
[-b] が指定された
$ bash getopts.sh -a -b
[-a] が指定された
[-b] が指定された
$ bash getopts.sh -abc -d
[-a] が指定された
[-b] が指定された
[-c] が指定された
$ bash getopts.sh -abc -d
[-a] が指定された
[-b] が指定された
[-c] が指定された
getopts.sh: 不正なオプションです -- d
該当なし OPT=?

以下のオプションは用意されていないことからエラー表示となります。

$ bash getopts.sh -abc -d
[-a] が指定された
[-b] が指定された
[-c] が指定された
getopts.sh: 不正なオプションです -- d
該当なし OPT=?

エラーメッセージを表示しない

 getoptsに指定していないオプションを使用すると、画面1のように「不正なオプションです – d」、あるいは「illegal option – d」のようなメッセージを表示します。

 このようなgetoptsのエラーメッセージを表示したくない場合は、「getopts :abc OPT」のように、オプション文字列の先頭に「:」記号を入れます。

#!/bin/bash

while getopts :abc OPT; do
  case $OPT in
     a) echo "[-a] が指定された";;
     b) echo "[-b] が指定された";;
     c) echo "[-c] が指定された";;
     *) echo "該当なし OPT=$OPT ";;
  esac
done

エラーが表示される getopts01.sh

$ bash getopts01.sh -abc -d
[-a] が指定された
[-b] が指定された
[-c] が指定された
getopts01: 不正なオプションです -- d
該当なし OPT=?

エラーが表示されない getopts02.sh

$ bash getopts02.sh -abc -d
[-a] が指定された
[-b] が指定された
[-c] が指定された
該当なし OPT=?

引数付きのオプションを使用する

「-f ファイル名」のように、引数を取るオプションを解析したい場合は、オプション文字の後に「:」記号を付けます。オプションの引数は、組み込み変数「OPTARG」で参照できます。

#!/bin/bash

while getopts :a:bc: OPT; do
  case $OPT in
     a) echo "[-a] が指定された(引数=$OPTARG)";;
     b) echo "[-b] が指定された";;
     c) echo "[-c] が指定された(引数=$OPTARG)";;
     :) echo "$OPTARGに引数が指定されていません";;
     ?) echo "$OPTARGは定義されていません";;
  esac
done

実行結果

$ bash getopts03.sh -a filename -b -c 100
[-a] が指定された 引数=filename
[-b] が指定された
[-c] が指定された 引数=100
$

解説
:a:bc: について

:a   エラー表示をしないというオプションとなります。
a:    -a が指定された場合は引数に数値または文字列を受け取ります。
c:    -c が指定された場合は引数に数値または文字列を受け取ります。
ヒント
アホか。というくらいまぎらわしくてわかりにくい設計で笑えます。一体どこの誰がこんなわかりにくい仕様にしたのでしょう。
ヒント
とにかくシェルクスクリプトで起動パラメータを設定することができました。便利なツールをたくさん作ってください。では

書籍の紹介

(12)【nkf】シェルスクリプトコマンド活用紹介

(12)【nkf】シェルスクリプトコマンド活用紹介

(10)【chmod】シェルスクリプトコマンド活用紹介

(10)【chmod】シェルスクリプトコマンド活用紹介