Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bashシェルスクリプトにオプションを実装する方法

ターミナルコマンドには通常、オプション(スイッチ)が用意されており、コマンドの動作を細かく変更できます。オプションはPOSIX仕様のコマンドラインインターフェースに組み込まれた機能であり、UNIX初期のアプリケーションから受け継がれてきた由緒ある慣習でもあります。そのため、自分でBashスクリプトを作成するときにも、オプションの実装方法を知っておくと非常に役立ちます。

ほとんどのプログラミング言語と同じように、Bashでオプションを解析する方法はいくつか存在します。筆者のお気に入りは、Linuxに出会った頃に初めてシェルスクリプトに触れるきっかけとなった、Patrick Volkerding氏のSlackwareビルドスクリプトから学んだ手法です。

Bashにおけるオプション解析

Bashでオプションを解析する基本的な戦略は、シェルスクリプトに渡されたすべての引数を順番に処理し、それがオプションかどうかを判定したうえで、次の引数へ移動(shift)することです。オプションがなくなるまで、この処理を繰り返します。

まずは、単純なブール型オプション(スイッチフラグとも呼ばれます)から始めましょう。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done

echo $ALPHA

このコードでは、処理すべき引数がなくなるまで繰り返されるwhileループを作成しています。if文は、先頭位置($1)にある引数が--alphaまたは-aと一致するかどうかを確認します。(これらは任意のオプション名で、特別な意味はありません。実際のスクリプトでは、--verbose-vを使って詳細出力を有効にするなどの使い方が考えられます。)

shiftキーワードにより、すべての引数が1つずつ前にずれ、2番目の位置($2)にあった引数が1番目($1)に移動します。else文は、処理すべき引数がなくなったときに実行され、whileループを抜け出します。

スクリプトの最後では、$ALPHAの値がターミナルに出力されます。

実際にスクリプトをテストしてみましょう。

$ bash ./test.sh --alpha
1
$ bash ./test.sh

$ bash ./test.sh -a
1

オプションが正しく検出されています。

Bashでの引数の検出

しかしここで問題があります。オプション以外の余分な引数が無視されてしまうのです。

$ bash ./test.sh --alpha foo
1
$

オプションとして意図されていない引数も受け取るには、残りの引数をBash配列に格納します。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done

echo $ALPHA

ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done

新しいバージョンのスクリプトをテストしてみます。

$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo

foo
$ bash ./test.sh --alpha foo bar
1
foo
bar

引数を取るオプション

一部のオプションは、それ自体が引数を必要とします。たとえば、色や画像の解像度といった属性をユーザーに設定させたり、アプリケーションにカスタム設定ファイルの場所を指定させたりしたい場合があるでしょう。

Bashでこれを実装するには、ブール型スイッチの場合と同じくshiftキーワードを使用しますが、引数を2つずらす点が異なります。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done

echo $ALPHA
echo $CONFIG

ARG=( "${@}" )

for i in ${ARG[@]}; do
echo $i
done

このコードでは、elif句を追加して、各引数を--configおよび-cと比較しています。一致した場合、CONFIGという変数の値が、2番目の引数の値に設定されます(これは--configオプションに引数が必要であることを意味します)。その後、すべての引数が2つずれます。1つは--config-c自体をずらすため、もう1つはその引数を移動させるためです。あとは通常どおり、一致する引数がなくなるまでループが繰り返されます。

新しいバージョンのスクリプトをテストしてみましょう。

$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz

オプション解析を簡単に

Bashには、ここで紹介した以外にもオプションを解析する方法があります。caseステートメントを使ったり、getoptコマンドを利用したりすることも可能です。どの方法を選ぶにせよ、ユーザーのために用意されたオプションはあらゆるアプリケーションにとって重要な機能です。そしてBashなら、その実装はとても簡単です。

  1. Windows 10にBash(Linuxシェル)をインストールして使う方法【WSL完全ガイド】

    Windows上でLinuxシェルをセットアップして使う方法を、Windows Subsystem for Linux(WSL)を使って解説します。 このチュートリアルは、2020年以降にリリースされた最新版のWindows 10を対象としています。古いバージョンのWindows 10でのWSLの使い方や、Windows 8/7/XP向けの別の方法については扱いません。サポートが終了したソフトウェアの使用は避けるべきだからです。どうしてもWindowsを使わなければならない場合は、必ずセキュリティ更新プログラムが提供されているバージョンを使用してください。 WSLは非常に優れたツールで、まるで

  2. Windows 10にLinux Bashシェルをインストールする方法【WSL設定ガイド】

    Bashシェルとは?Windows 10でLinuxが動く仕組み Bashシェルは、長年にわたりLinuxに搭載されてきたコマンドラインユーティリティです。そして現在、MicrosoftはこのBashシェルをWindows 10に直接組み込みました。これは仮想マシンでも、コンテナでも、Windows向けにコンパイルされたソフトウェアでもありません。実態は、Linuxソフトウェアを実行するための「Windows Subsystem for Linux(WSL)」というサブシステムであり、AndroidアプリをWindows上で動かすために開発されていた(後に中止された)Project Asto