Mac OS Xのコンソールからシェルスクリプトを使ってディレクトリをループさせながら複数のJavaのプログラムを実行する方法

この記事を書いた背景

顧客対応の関係で、複数の Java プログラムをチェックする必要があり、個数が多いので手動は嫌だというのが理由です。

環境が Mac OS X だったので、シェルスクリプト(.sh)ファイルをコンソールで実行しようと思ったのですが、パッケージ指定が必要になったときに for を使ってディレクトリを繰り返して指定する方法がすぐわからなかったので、メモしておきます。

参考:Windows のコマンドプロンプト(cmd)でディレクトリに対して for を使う方法

作成したシェルスクリプト

最終的に作ったスクリプトは次のようなものです。

#!/bin/sh

for dirname in `ls -d e*`
do
    echo
    echo "+++"$dirname"+++"
    cd $dirname"/bin"

    java -Dfile.encoding=UTF-8 < packagename >.< classname > < arguments >

    cd ../../
done

以下、本シェルスクリプトについての解説です。

「`」で囲む

「`」で囲うことによって、シェルに実行させた結果をスクリプト内で受け取る事ができます。

「ls -d e*」と言うのは、「e」で始まるファイル・ディレクトリのうち、「-d」でディレクトリのみを対象にして、「ls」で一覧にした結果を受け取ります。

今回は全てのプロジェクトが「e」で始まるようにしたのでこのように書きました。

for の変数名

for の直後の単語は、for ループ内で使える変数名となります。
for ループ中で使う場合、「$」を接頭辞とすることで変数として扱われます。

今回の場合、echo や cd するときに使っている「$dirname」が変数です。

文字コード指定

「java -Dfile.encoding=UTF-8」は、「java」実行時にファイルのエンコードが「UTF-8」であることを指定するオプションです。

パッケージ名付きで Java クラスファイルを指定

Java クラスファイルをコマンドラインで実行する場合には、実行している現在パスから見て「パッケージ名.クラス名」と指定しなければいけません。

ディレクトリ=パッケージ名なので、「< packagename >.< classname >」のように「.」を挟んで指定し、引数があれば「< arguments >」に渡せば良い、としました。

今回の案件は様々なテストパターンをコマンドラインから渡さないとならないので、複数行実行のコマンドが並ぶ漢字ですね。

実行方法

シェルスクリプトは「ターミナル」で動かす必要があります。
Spotlight などで「ターミナル」を起動しましょう。

また、シェルスクリプトには実行権限が必要です。
次の様に「chmod」コマンドを使って権限を付加しておきましょう。

$ chmod 755 < スクリプト名 >

まとめ

前に Windows で動くバッチファイルを作りましたが、やはりこういった繰り返し作業はできる限り手動は省いた方が良いですね。

え?Webサイトのバックアップ、してないの!?

いざという時には復旧までしてくれる
『ワードプレス外部バックアップサービス』

■3つの特長
・自分でやらなくて良い
・いざという時の復旧付き
・外部サーバーにバックアップ

コメントを残す