時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

shell コマンドライン取扱テンプレート

こんにちは、シェルスクリプト書くときにコマンドライン引数は必須ですよね?そのときに必須の項目やヘルプを作りたいと思ったことはありませんか?毎回調べていませんか?そんなときのためにテンプレートを作成したので使ってください。

#!/bin/bash

usage_exit() {
    echo "$0 -a sample -b sample2 "
    echo "-a [必須] 1つ目の引数を指定 "
    echo "-b [任意] 2つ目の引数を指定 "
    exit 1
}

VALUEA=""
VALUEB=""

while getopts a:b:h OPT
do
    case $OPT in
        a) VALUEA=$OPTARG ;;
        b) VALUEB=$OPTARG ;;
        h) usage_exit ;;
        \?) usage_exit ;;
    esac
done

if [ -z "$VALUEA" ]; then
    echo "-a は必須です"
    exit 9
fi

echo $VALUEA
echo $VALUEB

echo "success"

以下簡単に解説をします。

コマンドライン引数の扱い方

今回は getopts という方法でコマンドライン引数の指定を行っています。通常コマンドライン引数を取り扱う場合 $0 $1 のように受け取りますが、これでは -a ?? のように指定ができません。

getopts では以下の部分で、コマンドライン引数の指定を行うことができます。指定されたものは case 文で判定でき、その中で $OPTARG に引数に指定されたものが格納されています。

while getopts a:b:h OPT
do
    case $OPT in
        a) VALUEA=$OPTARG ;;
        b) VALUEB=$OPTARG ;;
        h) usage_exit ;;
        \?) usage_exit ;;
    esac
done

while getopts a:b:h OPT のようにすることで、 a,b,h 以外の入力時には以下のようにエラーが発生するようになります。

test.sh: illegal option -- f

必須項目の設定

本プログラムでは -a の指定は必須としています。そのために、はじめ VALUEAには空白を入れておき、変数が空白かどうかで指定されているかを判断しています。

if [ -z "$VALUEA" ]; then
    echo "-a は必須です"
    exit 9
fi 

上のように if 文中に -z オプションを入れることで空白の判定ができます。

おわりに

必須の指定やデフォルト値の指定ができるライブラリなどはいろいろありますが、原始的にコマンドライン引数指定子を使った場合はこの様になると思います。あとはお好みでカスタマイズしていくのが良いと思います。