Shellスクリプト

【Shell-Tips】外部ファイルからメッセージを取得する。

2020年4月28日

シェルスクリプトでエラーメッセージを出力するロジックは、前回の「【Shell-Tips】簡単なログ出力ロジックを作ってみました。」で取り扱ってきました。

次は「障害が発生しました。」等のエラーメッセージの取り扱いをどうするか考えてみましょう。 一般的に考えられるのは、下記の2点です。

  1. スクリプト内に出力するメッセージを予めハードコーディング(べた書き)する。
  2. メッセージ専用の外部ファイルから取得してログに出力する。

私の経験からいうと、答えは「2.外部ファイルから取得する」一択です。ですが、実際には、ちょっとした規模のプロジェクトでさえも、スクリプト内にハードコーディング(べた書き)しているスクリプトをよく見かけます。

ハードコーディングの問題は、メッセージを書き直す都度、スクリプトに手を入れる必要があることです。

そのスクリプトが多岐にわたって使用されている場合など、ハードコーディングされたメッセージの手直しが元で障害が発生してしまった場合、そのスクリプトを使用するシステム全体の機能が停止してしまうことになりかねません。

この記事では、出力メッセージを外部ファイルから取得する方法について解説していきます。

外部ファイルからメッセージ取得機能を実装する

前提

Beエンジニアでシェルスクリプトを実行する環境は下記の通り

ディレクトリ構成

  • BASE_DIR(任意のディレクトリ)
    • scripts
      • bin(実行スクリプト格納領域)
        • func.sh 👈 シェルスクリプトからログ出力関数を呼び出します。
      • com(共通スクリプト格納領域)
        • com_func.shrc(共通関数定義ファイル)👈 このファイルへログ出力ロジックを作成します。
      • etc(設定ファイル等の格納領域)
        • message.conf(メッセージ定義ファイル)
      • log(スクリプト実行ログの格納領域)
        • スクリプト名.log 👈 ログが出力されるファイル
      • tmp(テンポラリ領域)
      • rep(レポート出力領域)

外部ファイルは「 <BASE_DIR>/scripts/etc/message.conf 」配下へ作成されるものとして作成します。

メッセージ定義ファイルの作成

メッセージ定義ファイルとして下記のファイルを想定します。

I-00000番台:INFOMATION(情報)
W-00000番台:WARNING(警告)
E-00000番台:ERROR(エラー)

今回は指定された引数の数が正しくなかった場合(引数の値が2つ未満の場合にエラー)を例に作成してみます。
引数が最低3つ以上無いとエラーとします。

[ <BASE_DIR>/scripts/etc/message.conf ]

message.conf

E-00001 user.err " The number of arguments is incorrect. args_count: ["$#"]"

なぜメッセージを英文で記述しているのでしょうか? それは文字エンコーディングの関係にあります。絶対にUTF-8で使用することを前提に作成する場合は、日本語でメッセージを書いても問題ありません。しかし、異なる文字エンコードを使用したOSで実行した場合、文字化けがおきてしまいログとしての使用に耐えません。そのため、特に問題が無いのであればメッセージ文は英語で記述することをお勧めします。

メッセージ取得関数の作成

メッセージ定義ファイルから、引数に指定された番号のメッセージを取得して返します。

1-7行目:コメント

7行目:関数「getMsg ()」の宣言

8行目:ファシリティー取得(メッセージの不必要な部分のカット用)

9行目:メッセージ定義ファイルから、引数に指定された番号のメッセージを取得

10行目:取得したメッセージを標準出力で返却

共通関数定義ファイルへの実装

呼び出し側のシェルスクリプト作成

「func.sh(実行シェルスクリプト)」へ実装すると下記の様になります。
「func.sh」は「template.sh」を基に作成しています。

[ template.sh ]は、【Shellの基礎知識】で解説しています。下記のリンクページを参照してください。

[<BASE_DIR>/scripts/bin/func.sh ]

49行目:引数チェック関数の宣言

50行目:判定文(引数の数が2つ未満の場合はエラー)

51行目:引数が2つ未満の場合はエラーと判定され、メッセージ定義ファイルから、メッセージID「E-00001」のメッセージを取得し、「eval」コマンドを使って2重展開表示しています。
eval」コマンドを使用してメッセージを2重展開している為、メッセージ中のテキスト「$#」がコマンドとして機能していることに注目してください。

eval」コマンドは基本組み込みコマンドです。

外部ファイル出力関数の実行

あえてエラーを発生させるために引数を「No1 No2」の2つで実行させます。

# 実行シェルスクリプトからエラーログの出力テスト
$ <BASE_DIR>/scripts/bin/func.sh No1 No2

「<BASE_DIR>/scripts/bin/func.sh」の引数チェック関数でエラー判定が行われ、その結果エラーとしてログに出力されています。

出力ログの9-11行目「scope領域」が[ pre ]であることに注目してください。引数チェック関数で判定エラーを起こしている為、[ main ] 領域手前(scope領域[ pre ])で処理が終わっていることを示しています。

本スクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。

よく読まれている記事

1

独立前は、誰もが不安でいっぱい。近い将来、フリーランスとして独立を考えている方が独立初期に躓かないために「独立前にやるべきことチェックリスト」をご紹介します。 当記事は前編となる「お金まわり編」。全て ...

2

ゲームなどのエンタメ分野での導入が進んでいるVR。言葉自体は耳にしたことがあっても、その意味を詳しく知らないという人も多いのではないでしょうか。また、次世代の新たな技術をビジネスに積極的に活用していく ...

3

フリーランスの確定申告には、青色申告と白色申告の2種類があります。いったいどちらの申告方法を選ぶべきなのでしょうか。 この記事では、青色申告と白色申告、それぞれのメリット・デメリットを把握することでベ ...

4

フリーランスの仕事場は、自宅をはじめとし、カフェや図書館、コワーキングスペースなど自由に選べます。しかし全ての場所で100%集中ができるどうかは、人それぞれです。どのような環境が自身の仕事場として快適 ...

5

フリーランスのITエンジニアとして、一番難しいのは「自己管理」と言えるでしょう。 自分の体調管理はもとより、仕事のスケジュール等すべて自分で管理します。もちろんフリーランスに有給休暇等ありませんから休 ...

-Shellスクリプト

Copyright© Beエンジニア , 2020 All Rights Reserved.