Linuxのshellで、ftpを使ってデータを転送するシェルを作成しています。
転送部分はうまくいき、エラー制御を考えているのですが上手くいきません。(ログは取得できてます)
やりたいことは、ftp転送で失敗したかどうかの判定をしたい。ということです。
過去ログ等見ていて、ログファイルからエラーNoをgrepして判断する。というやり方があったので
試して見ましたが、構文が正常に書けていないようです。すみませんがアドバイスをお願い致します。
ftp転送終了したとします。 ログは $Log_Path/$date.txt にとってあります。
grep ^425 $Log_Path/$date.txt /dev/null
if $? eq 0
then
error_flag=1
exit 1
fi
(エラーが発生したら、error_flagに1が入るようにしたい)
エラーナンバーは425(データコネクションをオープンできない)というやつで、いいかなと思っていますが、もっと適切なものがあれば教えて下さい。(putで行っている転送の失敗を判断できればいいです)
上記の構文ではエラーが出ます。
また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか?
宜しくお願い致します。
No.4
- 回答日時:
たぶんで申し訳ないんですが、対話的に使用するftpコマンドよりも
wgetコマンドを使用したほうがいいと思います。
ログをgrep することなく、wgetコマンドの直後に $? の比較で
済むと思います。
No.3ベストアンサー
- 回答日時:
grepは、一致した行を画面に出力してしまうので、それを見たくない場合は煩わしい。
そのような時には画面出力を捨てます:grep ^425 $Log_Path/$date.txt > /dev/null
不等号記号 ">" に注意して下さい。これは「標準出力を /dev/null というファイルに出しなさい」という意味です。不等号記号は「リダイレクション」という機能ですから、詳しくはリダイレクションの使い方を調べてみてください。また、/dev/null がどういうファイルかも、シェルプログラミング関連で調べられると思います。
あるいは、grep に "-q" (quiet) オプションがあれば、
grep -q ^425 $Log_Path/$date.txt
で同じ効果が得られるんじゃないかと思います。
また、"if" は、コマンドを実行しその戻り値を利用するのですから、"if" の直後はコマンドです。従って、
if test $? eq 0
と書きます。"test" というコマンドに "$? eq 0" という式の真偽を計算させるのです。
さらに、それで悪くはないのですが、どうせコマンドの戻り値を使うなら、"if" の後に直接 grep を書いてやればいいじゃないか . . . ということになります。
また、error_flag=1 としたあとに、exit していますが、それではせっかく設定した変数error_flagが無駄になってしまいませんか?
以上のことを考えると
if grep ^425 $Log_Path/$date.txt > /dev/null
then
exit 1
fi
になると思います。あとは、個人の好みですが、僕だったらもっと簡潔に
(grep ^425 $Log_Path/$date.txt > /dev/null) && exit 1
と書くと思います。
最後にですが、ftpなどの、本来は対話的に使うように出来ているコマンドをスクリプトで使うのは結構辛いです。そこで、"expect" という、対話コマンドをスクリプトから使うためのコマンドもあります。ずっと昔使っていただけで、使い方は忘れてしまいました。また、転送が失敗したかどうか知りたいだけだったら、wgetをftpコマンドの代わりに使う方がずっと楽かも知れません。
とても丁寧な回答ありがとうございます。
非常に解りやすく、参考になりました。
意味のわかっていなかった部分も改善できました。
アドバイスいただいた内容で試して見たいと思います。
ありがとうございました。
No.2
- 回答日時:
>(エラーが発生したら、error_flagに1が入るようにしたい)
そのerror_flagは何者です?
シェル内の変数ですか?
環境変数ですか?
# どちらにしろ、exitで抜けているので意味ありませんが…。
# シェル内で環境変数を変更しても、親プロセス(呼び出し側)には影響しなかった…かと。
呼び出し側でエラーによる分岐をしたいのであればexitで返却する終了コードで分岐すべき…かと思います。
>上記の構文ではエラーが出ます。
どういうエラーが出ますか?
>また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか?
なんか抜けていませんかね?
grep ^425 $Log_Path/$date.txt > /dev/null
なんじゃないですか?
/dev/nullへのリダイレクトなら、grepの出力結果を捨てる。というだけです。
回答ありがとうございました。
また、提示情報が不足しておりもうしわけありませんでした。
他の方かも頂いた回答で解決できそうです。
ありがとうございました。
No.1
- 回答日時:
正しくは
grep ^425 $Log_Path/$date.txt > /dev/null
if [ $? -eq 0 ];
then
#error_flag=1
exit 1
fi
だと思います。
grepは正規表現に該当した行を出力するので、それを「 > /dev/null」で表示させないようにします。
ifの比較の文も変更しています。スペースに注意して下さい。
error_flag=1とexit 1ですがどちらか一つにして下さい。
シェルの実行方法は
A) ./aaa.sh
B) source ./aaa.sh
の二通りありますが、Aではサブシェル内で実行され、Bでは現在のシェル内で実行されます。
Aではerror_flag=1が現在のシェルに引き継がれないので、意味を持ちません。
Bではexit 1で現在のシェルを終了させてしまいます(要するにコマンドプロンプトが閉じる)。
迅速な回答ありがとうございました。
不明点も明確になり、理解が増しました。
基本的な部分がわかっておらず申し訳ありません。
徐々に改善していければと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 再質問、VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。 9 2023/02/28 15:32
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- 仕事術・業務効率化 頼まれてない事を自己判断でやることについて 1 2022/08/12 17:15
- UNIX・Linux Kali Linuxで起動できない - Minimal BASH Like Line Editing 1 2022/06/03 13:14
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
シェルスクリプトでFTPの実行結果を取得するには
その他(プログラミング・Web制作)
-
FTPコマンドの戻り値について
その他(OS)
-
ftpコマンドの戻り値をチェックしたい
その他(プログラミング・Web制作)
-
-
4
FTPの送信結果を検知したい
その他(プログラミング・Web制作)
-
5
FTP送信エラーの検知について
その他(プログラミング・Web制作)
-
6
ftp処理でmove(移動)を行いたい
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ubuntu(linux)のシャットダウン...
-
ubuntuのサーバー(virtual box)...
-
Ubuntu on Xorgのログインについて
-
ubuntuで デイスク/deb/loopと...
-
AWSでSSH接続をしたいのですが...
-
Linux Ubuntu22.4の起動時エラ...
-
Linux Mint 日本語入力できなく...
-
ChromebookでPythonを使いたい...
-
Linux Mint でも使えないですよ...
-
Windowsのローカルディレクトリ...
-
Ubuntuサーバーでメールを受信...
-
AppImageがインストールできな...
-
Kali Linuxで起動できない - Mi...
-
ノートPCでUSBから起動しない
-
ssl_error_logのエラー内容(AH...
-
ssl_request_logの必要性について
-
古いiMacにLinuxをインストール...
-
Let’s Encrypt の自動更新をcro...
-
windows10を使っています。 wsl...
-
Linux のシェルスクリプトの強...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
scpコマンドでリモートサーバの...
-
DOSコマンドでのワイルドカ...
-
rcpコマンドについて、教えて!
-
Illustratorのデータをまとめて...
-
telnet,rlogin,rshの違いってな...
-
IBM漢字コードのSJIS変...
-
FTP接続中のコマンド実行結果を...
-
GNOME端末の起動 及び コマンド...
-
AIX ksh利用 grep 検索で マ...
-
【ターミナル】MacBookにディー...
-
lsコマンドで表示するファイル...
-
Windows10のRegSys32に登録され...
-
別名でリンク先を保存。
-
属性変更できないです。
-
AIXの勉強方法について
-
ログイン、ログアウト時にコマ...
-
linuxのreadコマンドについて
-
cactiでグラフが表示されない
-
Macの Terminal でのエラーと...
-
Solaris rmコマンドをシェルで...
おすすめ情報