アプリ版:「スタンプのみでお礼する」機能のリリースについて

Linuxをつかいシェルスクリプトを組んでいます
複数ファイルの存在有無を確認し、問題なければ、
ファイルを作成する処理を作成したいと思っています。
現在つまずいているのが以下の2点です。
 (1)複数ファイルが無い場合、エラーとしたいが、「too many arguments」とででしまう。
 (2)HASH.tmp情報取得中にエラーとなったらエラーを出したいが、エラー終了ステータス返却処理に流れない。

初めてで色々しらべながらやっていますが、うまくいかず止まってしまいました。
どなたかご助言お願い致します。



(1)
#==============================================================================#
# データ抽出用sqlファイル存在確認
# CSVファイルが無かったらエラーを出したい。
# 終了ステータス返却
# 終了ステータスが"0"以外の場合は、"1"を返却する
#==============================================================================#
if [ ! -f "${DATA_DIR}/"*.csv ]; then
# ログ出力
OUT_MSG_LOG -E "抽出ファイルが存在しません。"
OUT_MSG_LOG -E "抽出シェル - 終了 終了ステータス :1"
OUT_ACT_LOG SH 12 ""
OUT_ACT_LOG SH 02 ""
exit 1
fi


(2)
#==============================================================================#
# ハッシュ情報取得処理
#==============================================================================#
mktemp ${DATA_DIR}/HASH.tmp >/dev/null

for arg in *.csv
do
md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> HASH.tmp
done

#==============================================================================#
# 終了ステータス取得
#==============================================================================#
RS=$?

#==============================================================================#
# エラー終了ステータス返却
# 終了ステータスが"0"以外の場合は、"1"を返却する
#==============================================================================#
if [ ${RS} -ne 0 ]; then
# ログ出力
OUT_MSG_LOG -E "抽出処理実行中にエラーが発生しました。"
OUT_MSG_LOG -E "抽出シェル - 終了 終了ステータス :${RS}"
OUT_ACT_LOG SH 12 ""
OUT_ACT_LOG SH 02 ""
exit 1
fi

A 回答 (3件)

ベタですが、こんなのはいかがでしょうか。


(1)
for arg in *.csv
do
if [ -f "$arg" ]; then
break
else
# エラー処理
exit 1;
fi
done

(2)
for arg in *.csv
do
md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> HASH.tmp
if [ $? -ne 0 ]; then
# エラー処理
exit 1;
fi
done
    • good
    • 0
この回答へのお礼

ありがとうございます
(1)については動作確認できました。
(2)ですが、どうしたらエラー処理には入れるようになるのかが分かりません。
HASH.tmpを処理中に削除したりしましたがダメでした。
何か方法はありますでしょうか?

お礼日時:2009/10/19 21:47

> (2)ですが、どうしたらエラー処理には入れるようになるのかが


> 分かりません。
> HASH.tmpを処理中に削除したりしましたがダメでした。
> 何か方法はありますでしょうか?

chmod a-w HASH.tmp
でエラーになりませんか。
root 以外ならエラーになると思います。

ちなみに、
if [ $? -ne 0 ]; then
# エラー処理
exit 1;
fi
だと、パイプの左側のコマンドだけがエラーになった場合は
エラー処理が行われません。パイプの左側のコマンドの
エラーもとらえるには bash 限定で
if [ $? -ne 0 -o $PIPESTATUS -ne 0 ]; then
# エラー処理
exit 1;
fi
とすればよいようです。

bourne shell だと、参考 URL でできるようです。

参考URL:http://ja.doukaku.org/comment/6045/
    • good
    • 0

(2) の方ですが, 上の mktemp で作っている ${DATA_DIR}/HASH.tmp と do の中で使っている HASH.tmp とはどのような関係があるのでしょうか?


あと, $? をテストするなら test は使わずに
if md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> HASH.tmp; then
エラー処理
fi
とするのが普通でしょう. で, ここがエラーになる状況を作ればいいんだけど... それってどんな状況?
    • good
    • 0
この回答へのお礼

mktempでHASH.tmpをつくってそのファイルに情報を詰め込んでいるだけです。
mktemp ${DATA_DIR}/HASH.tmp = HASH.tmpです。(ただ${DATA_DIR}を消して投稿しただけです。)
エラーを入れているのはもしも、の為です。

お礼日時:2009/10/20 00:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!