sh 4

シェルスクリプトを書きます。
shを使います。shを使いましょう。

2つのファイルを比較して一致したか結果を表示させることを連続して行います。

  • regression_test/
    • test_001/
      • A.check
      • B.check
    • test_002/
      • A.check
      • B.check
    • test_003/
      • A.check
      • B.check

連続して比較して一致したか結果を表示する

sample_004.sh

#! /bin/sh

TRUE=1
FALSE=0

all_ok_flag=$TRUE
ok_numbers=0
ng_numbers=0

pushd result

for dir in *; do

    echo '------------------------------------------------------------'

    diff -s $dir/A.check $dir/B.check

    if [ $? -eq 0 ]; then
        echo "$dir : OK"
        (( ++ok_numbers ))
    elif [ $? -eq 1 ]; then
        echo "$dir : NG"
        (( ++ng_numbers ))
        all_ok_flag=$FALSE
    else
        echo "$dir : diff error"
        exit
    fi

done

echo '------------------------------------------------------------'
echo

if [ $all_ok_flag -eq $TRUE ]; then
    echo '============================================================'
    echo 'TEST ALL OK'
    echo
    echo "TOTAL : $(( $ok_numbers + $ng_numbers ))"
    echo "OK    : $ok_numbers"
    echo "NG    : $ng_numbers"
    echo '============================================================'
else
    echo '============================================================'
    echo 'TEST NG'
    echo
    echo "TOTAL : $(( $ok_numbers + $ng_numbers ))"
    echo "OK    : $ok_numbers"
    echo "NG    : $ng_numbers"
    echo '============================================================'
fi

popd

説明します。

pushd result

pushdする。後でpopdする。移動して、元の場所に戻る。

pushd/popdについては下記を参照。
自分が移動する

for dir in *; do

current directoryのすべてのfileをdir変数に入れる。ここではcurrent directoryの下は全てdirectoryであることを想定している。

for file in *.txtfor file in *.xmlとして該当のfileのみに対して処理することもできる。慣れたらfor f in *.txtなどとする場合が多い。

diff -s $dir/A.check $dir/B.check

差分を表示させる。

-sオプションは一致したことも報告させる。

$?

直前の実行結果。

直前の行が成功したらゼロが入っていることを期待している。(C言語のmain関数の最後にreturn 0;と書いてあるはず。)
先頭でSUCCESS=0という変数を作ると読みやすくなる。
そして「SUCCESSがゼロ」について## SUCCESS is zero : expect "return 0;"みたいなコメントも入れる。
運用性、保守性を上げよう。

ちなみに変数はSUCCESS = 0と空白を入れて書いてもよい。SUCCESS=0などとして空白を入れない書き方の方が多いと思う。
ここでは/bin/bashは使わずに必ず/bin/shを使って、変数をつくるときは空白を入れるな、と説明する。

-eq

比較した値が等しい。整数。

下記に比較についての一部をまとめる。

-eq 比較した値が等しい。整数。
-ne 比較した値が等しくない。整数。
= 比較した文字列が等しい。
!= 比較した文字列が等しくない。

C言語などと異なるため、下記の様なコメントやREADMEを用意すると良い。
## -eq : integers are identical
## -ne : ! -eq (integers are NOT identical)
## = : strings are identical
## != : ! = (strings are NOT identical)

(( ++ok_numbers ))

計算をしたい場合は(( ))で囲む。

echoする場合はecho $(( ++ok_numbers ))とする。他の場合も同様。
let "++ok_numbers"とも書ける。

下記のようなこともできる。
((x = x + 1))
let "x = x + 1"

演習

期待値との比較となるように変更しましょう。

まとめ

bashでもcshでもありません。shです。shで書いたらみんな幸せです。
みんなで幸せになりましょう。

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »
カテゴリーUNIX