- 締切済み
シェルスクリプトでエラー値取得
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
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- t-okura
- ベストアンサー率75% (253/335)
> (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 でできるようです。
- Tacosan
- ベストアンサー率23% (3656/15482)
(2) の方ですが, 上の mktemp で作っている ${DATA_DIR}/HASH.tmp と do の中で使っている HASH.tmp とはどのような関係があるのでしょうか? あと, $? をテストするなら test は使わずに if md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> HASH.tmp; then エラー処理 fi とするのが普通でしょう. で, ここがエラーになる状況を作ればいいんだけど... それってどんな状況?
- t-okura
- ベストアンサー率75% (253/335)
ベタですが、こんなのはいかがでしょうか。 (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
お礼
ありがとうございます (1)については動作確認できました。 (2)ですが、どうしたらエラー処理には入れるようになるのかが分かりません。 HASH.tmpを処理中に削除したりしましたがダメでした。 何か方法はありますでしょうか?
お礼
mktempでHASH.tmpをつくってそのファイルに情報を詰め込んでいるだけです。 mktemp ${DATA_DIR}/HASH.tmp = HASH.tmpです。(ただ${DATA_DIR}を消して投稿しただけです。) エラーを入れているのはもしも、の為です。