Shell の基礎知識

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

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

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

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

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

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

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

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

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

前提

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

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • func.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • comFunc.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

Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロンプト画面を開いているとき、常にShellは起動している状態です。 「Shell」とは ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shell の基礎知識