• 締切済み

シェルスクリプトでエラー値取得

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

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

> (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/
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

(2) の方ですが, 上の mktemp で作っている ${DATA_DIR}/HASH.tmp と do の中で使っている HASH.tmp とはどのような関係があるのでしょうか? あと, $? をテストするなら test は使わずに if md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> HASH.tmp; then エラー処理 fi とするのが普通でしょう. で, ここがエラーになる状況を作ればいいんだけど... それってどんな状況?

optimas
質問者

お礼

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

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

ベタですが、こんなのはいかがでしょうか。 (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

optimas
質問者

お礼

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

関連するQ&A

  • シェルスクリプト

    Apache centos6.6 シェルスクリプトの質問です。 shファイルを作りたいです。 home/user/log の中にある access_logとerror_logをgzに圧縮したいです。 条件は1日前のログです。 圧縮した後gzのファイルしか残らないのですが、次のアクセスログとエラーログはちゃんと出力されますか? どうかお願いします

  • シェルスクリプトの作り方

    OSはVineで、bashシェルです。 シェルスクリプトの作り方ですが、 1.ファイルを作る。 例えば、 #!bin/sh cd tmp このとき、ディレクトリはどこでもいいのでしょうか? 2.権限を付ける。 chmod u+x filename 3.実行 ./filename 他に気をつけることはないでしょうか? 実行すると、 bash: ./filename: bad interpreter: そのようなファイルやディレクトリはありません となってしまって、どうしても実行できません。

  • シェルスクリプトでエラー時にリトライ方法

    下記のようなシェルスクリプトを作成したいと思っています。 apacheのアクセスログを確認し、 (1)httpステータスが200なら後続の処理を実行 (2)200以外ならエラーを表示させ、  200以外なら5回リトライして5回ともhttpステータス"200"が一度も返ってこなければ(grepに含まれていなければ)スクリプトを中止するような処理を行いたいです。 初心者でループ処理?リトライ処理?というのがよくわかっていなくて… 下記のようなスクリプトにどう手を加えたらいいかご教授いただけますでしょうか。 #!/bin/sh cd /XXX/apache/log if tail -n 5 access_$DATE.log grep "|200|" >/dev/null; then tail -n 5 access_$DATE.log grep "|200|" echo "httpステータスは200です" else echo "httpステータスは200以外です" exit fi : よろしくお願いします

  • シェルスクリプトについて教えてください

    以下のようなフォルダ構成があります。 /var/tmp/組織コード/log このlogディレクトリ配下に0byteのファイルがたくさんあり、それを全て定期的に削除したいと思っています。 また、同ディレクトリにはそれ以外のファイルやフォルダも入っていて、それらは絶対に削除してはいけないものです。 以下のようなコマンドを考えたのですが、なにか懸念される点はあるでしょうか? find /var/tmp/*/log -size 0c -exec rm {} \; いろいろ調べたのですが、Linux系は初心者のため、これで妥当かどうか不安なのです。 環境はSolaris11で、bashです。 「組織コード」の部分を固定値にしてコード数分コマンドを書けば確実だとは思いますが、組織コードが増えたり変わるたびにシェルにもメンテが必要になるので、イマイチだと思っています。 詳しい方、ぜひアドバイスしていただけないでしょうか。 よろしくお願いします。

  • シェルスクリプトについて

    /bin/shで標準出力エラーを画面に出力せずにファイル数を変数に格納することはできますか? (質問) /tmp配下にaaa,aaa1,bbb,cccのファイルがあるとします。 aaaを含むファイル数を取得する場合以下で取得可能かと思います。 filenum=`ls -l /tmp/aaa* | wc -l` echo $filenum filenumの結果として2が得られる思います。 /tmp配下に存在しないgggのファイル数を取得する場合、標準エラーが表示されてしまいます。 filenum=`ls -l /tmp/ggg | wc -l` echo $filenum 画面上にgggというァイルがない旨のエラーが出力されてしまいます。 画面上にエラー出力されずにfilenumに0が取得できるようにするにはどのようにすればよいでしょうか。 また、同一のコマンドラインでファイルが存在する場合はそのファイル数が取得できるようにしたいです。 よろしくお願いします。

  • RedHatでのシェルスクリプトについて

    こんにちは。また質問させて下さい。 redhat7.0のシェルスクリプトで、 サンプルコード片手に以下のコードを記述しました。 やりたい事は、もしaaa.txtというファイルが存在したら その内容を表示させ、存在しなければその旨のメッセージを 表示させる、という単純なものです。 この時、ファイルが存在しない時に ./test.sh: /tmp/aaa.txt: No such file or directry というエラーになってしまいます。 エラーを抜けてメッセージを表示させるには どうしたらいいでしょうか。 アドバイスよろしくお願いいたします。 *********記述したコードです。************* #!/bin/bash fileName=/tmp/aaa.txt read varStr1 varStr2 <fileName if [ -a fileName ]; then echo {$varStr1} else echo{$fileName}{$varStr2} fi

  • リスナーログをシェルで自動で消す

    リスナーログをシェルで自動で消したいです。 ただ、ログは一切消失できません。 おおよそ #lisnctl LSNRCTL> set log_file listener.tmp.log # mv listener.log listener.old LSNRCTL> set log_file listener.log # cat listener.old listener.tmp.log > listener_YYYYMMDD.log のようなイメージを考えていますが、 これをシェル化(シェルでなくても自動化) する事は可能でしょうか?

  • Cシェルについて

    Cシェルについて #! /bin/csh ##! /bin/csh -vx setenv NOHUP '/usr/bin/nohup' set AAA_CSH = $NOHUP' XXX.sh file.txt &' ($AAA_CSH >> /dev/null) >>& err.log シェルスクリプトを作成して上記のとおりnohupでXXX.shを実行するように記述します。 エラーがあった場合、err.logに出力するように作成したつもりなのですが、 XXX.shがなかったとき、 「/usr/bin/nohup: XXX.sh:そのようなファイルまたはディレクトリはありません。」 と標準出力されてしまいます。 このエラーメッセージをerr.logに記述するようにしたいのですが、 どうしたらよいでしょうか? よろしくお願いいたします。

  • シェルの中から他のシェルを呼び出す

    例えば、ひとつのシェルファイル( aaa.sh )の中に、 ------------------------- #!/usr/bin/csh set HOME=/home/test/tmp bbb.sh ------------------------- と記述した場合、bbb.shで変数$HOMEを使いたいと思いましたが、 使えないようです。(HOME: 未定義の変数と表示されます) どなたか、これ以外の方法で、このように シェルからほかのシェルを呼び出して、変数も引き継がれるような方法ご存知ないでしょうか? 多分こーやれば、こうなるかも!みたいなご回答でも結構ですので情報提供をお願いします。 どうぞ宜しくお願い致します。

  • Linux シェルスクリプト

    シェルスクリプト作成の今後の参考にしたいので 以下のスクリプトを1つでも良いので作成してみてください。 1、sono1.sh $ ./sono1 ファイル名 で、 ファイルを削除せずにあるフォルダ(例えば .box1)に移動させるスクリプト。 ただ、すでに .box1 に同名のファイルがあった場合には上書きせず、既 存のファイル、新しいファイル両方を .box1 内に保存できるようにしてください。 2、sono2.sh $ ./sono2 拡張子 で、.box2 というフォルダにあるファイルの内, 指定された拡張子をもつファイル名だけを表示するスクリプト。 3、sono3.sh 現在のディレクトリにあるファイルのうち、texファイルから生成されたフ ァイル (*.log, *.aux, *.dvi )を削除するスクリプト。 ただし、texファイルが存在しないものについては削除しない。 つまり、 333.tex 333.aux 333.dvi aaa.log が存在する場合、削除するのは 333.aux と 333.dvi だけ.