シェルスクリプトを書きます。
shを使います。shを使いましょう。
2つのファイルを比較して一致したか結果を表示させることを連続して行います。
- regression_test/
- test_001/
- A.check
- B.check
- test_002/
- A.check
- B.check
- test_003/
- A.check
- B.check
- test_001/
連続して比較して一致したか結果を表示する
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 *.txt
やfor 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(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト