Bashスクリプトを扱う際、コマンドラインオプションの解析は非常に重要です。getopts
はBashで簡単にオプションを解析するためのビルトイン機能ですが、初心者には少々ハードルが高いと感じるかもしれません。この記事では、getopts
を用いたオプション解析の基本をわかりやすく解説します。
getoptsの基本概要
getopts
はBashスクリプト内でコマンドライン引数を処理するためのコマンドです。特に、複数のオプションや引数が存在する場合、getopts
を使うことでそれを整理して効率よく管理することができます。
ユーザーがコマンドラインで指定するオプションは通常、ハイフンで始まり、その後に一文字(あるいは二文字以上の場合も)続く形式です。例えば、ls -l
やtar -xvf
などです。getopts
を使うと、このようなオプションを簡単に解釈できます。
基本的な構文
getopts
の基本的な構文は以下の通りです:
getopts optstring variable
-
optstring
は許可するオプションを列挙した文字列です。 -
variable
には、解析されたオプションが格納されます。
ここで具体的な例を見てみましょう。
#!/bin/bash
while getopts ":ab:c" opt; do
case $opt in
a)
echo "Option -a was supplied"
;;
b)
echo "Option -b was supplied with argument: $OPTARG"
;;
c)
echo "Option -c was supplied"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
:)
echo "Option -$OPTARG requires an argument." >&2
;;
esac
done
上記のスクリプトは、-a
, -b <argument>
, -c
という3つのオプションを受け取ります。
詳細な解説
オプション文字列の設計
optstring
には、解析したいオプションを連ねて指定します。例えば、abc
とすれば-a
, -b
, -c
の各オプションを識別します。:
を後に続けると、そのオプションは値を必要とすることを示します。今回の例では、b
に続く:
が、-b
が値を伴うべきオプションであることを示しています。
特殊変数OPTARG
値付きオプションが解析された場合、その値はOPTARG
に格納されます。例えば、スクリプトが-b value
を処理した際、$OPTARG
にはvalue
が入り、スクリプトの中でその値に基づいた処理を施すことが可能です。
ループとcase文
getopts
はループと共に使われることが多く、各オプションが取り出されるたびに処理を行うことができます。case
文を用いることで、各オプションに対する様々な処理を記述できます。case
文の構造を使えば、オプションが増えた場合でも容易に可読性を保ちながら拡張することができます。
エラーハンドリング
getopts
にはいくつかの自動エラー報告機能があります。例えば、対となる引数が不足している場合には自動的にエラーメッセージを出力します。それでも、エラーの内容や方法を自分でカスタマイズしたい場合は、:
)と\?
)を使って制御することが可能です。
-?
このエラーハンドリングは、無効なオプションをキャッチする際に使います。入力が-x
としてオプション文字列に存在しない場合、\?
のケースに該当しエラーメッセージを吐き出します。
-:
オプションが必要な引数を欠いている場合には,:
と記述された部分が実行されます。これにより、引数が不足している旨を通知できるのでユーザーは誤った入力を訂正することができます。
実行例と応用
ここで一つの応用例を挙げてみます。例えば、ファイルのバックアップを行うスクリプトを作る場合:
#!/bin/bash
backup=0
restore=0
directory=""
while getopts ":brd:" opt; do
case $opt in
b)
backup=1
;;
r)
restore=1
;;
d)
directory=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
if (( backup )); then
echo "Backing up directory $directory"
# ここにバックアップコードを追加
fi
if (( restore )); then
echo "Restoring directory $directory"
# ここにリストアコードを追加
fi
このスクリプトは-b
でバックアップ、-r
でリストア操作を行い、-d
でディレクトリを指定できます。この構文を用いることで、他のBashスクリプトにおいても柔軟にオプションを処理できます。
まとめ
今回紹介したgetopts
の利用により、Bashスクリプト内でより柔軟かつ強力にコマンドラインオプションを扱うことができます。最初は慣れるまでに時間がかかるかもしれませんが、一度理解すると非常に役立つスキルです。基本を押さえて、必要に応じてより複雑なスクリプトに挑戦してみましょう。Bashスクリプトを手間なく強化することができるため、ぜひこれを活用してください。
コメント