ARAIBOムービーまとめengSearch上田ブログなお、このサイトはbashでできている。今回の開眼シェルスクリプトは、なにかしらの重要なファイルを上書き更新するシェルスクリプトを扱います。ファイルを更新するということは「覆水盆に返らず」ですので、それなりに気を使うべきです。今回はシェルスクリプトを使って安全に更新する方法を扱います。いう発言を捕捉することがあります。変更できないのかということでしょう。fileUNIX系OSにおいては、このようなコマンドは少数派です。sedやnkfコマンドは上書きができますが、オプションを指定しないと上書きモードになりません。ファイル上書きをむやみに許してしまうと、次のようになにかと不都合です。パイプ接続できるコマンドとできないコマンドの識別する労力が増大なにか失敗すると後戻り不可能。面倒ファイルを上書きしたいときは、面倒でも次のような手続きを踏みます。もとのファイルのバックアップをとったりします。一度別のファイルに結果を出力してからmvする方法は合理的と言えます。シェルスクリプトでも、同様の手続きを踏みます。いい加減ネタ切れですが、今回も格言(?)を。前回に引き続き、架空の団体「UPS友の会」の会員管理を扱います。今回は会員リストへの新会員の追加処理をシェルスクリプト化します。様々な仕掛けをします。今回は細かい文法をいくつか知っておく必要があります。今回はbashの文法を使います。今回は、リスト1の環境でプログラムを組んで動作させます。11.10まず、ディレクトリを準備をします。適当な場所に、リスト2のようにディレクトリを掘ります。newmembernewmemberは、新しく追加する会員のリストで、一時的なのものです(リスト3)。kagawa@dokaben.comMEMBERファイルには、次のような既存会員データが記録されています(リスト4)。このファイルが原本です。入力をチェックしてから追記処理をしなくてはなりません。リスト5のようにエラーを検知する仕組みを書きます。処理できませんでした。05~12行目はbashの関数です。呼び出し方はコマンドと一緒で、名前を行頭に書きます。「falseで失敗」は、CHECK関数の第一引数で、関数内で$1として呼び出せます。リスト5では、8行目で$1を使っています。エラーメッセージは、標準エラー出力に出すのが行儀良いでしょう。echoの出力先を標準エラー出力にリダイレクトできます。標準エラー出力は人間が読むために使います。6行目の呪文を一つずつ紐解いていきましょう。パイプでつながったコマンドの終了ステータスを記録した文字列に置き換わります。パイプでつながったコマンドの終了ステータスを記録できるようになっています。リスト6に例を示します。失敗(終了ステータス1)を返すコマンドです。0PIPESTATUSが分かったところで再びリスト5の6行目に戻ります。括弧中のコマンドの標準出力を文字列として置き換えるための表記方法です。コマンドの終了ステータスがすべて0ならば空文字列になります。コマンドにエラーがなければCHECK関数をすぐに出て処理に戻ります。ついても解説が必要でしょう。マニュアルが表示されるはずです。条件式が満たされれば終了ステータス0を返すコマンドです。空文字ならば終了ステータス0を返します。リスト7で動きを示します。左側のコマンドの終了ステータスが0の場合に右側のコマンドが実行されます。returnが実行されて処理が関数から出ます。終了ステータス1でスクリプトが終わります。変数や文字列に置き換わる部分を”“で囲んでください。リスト8のように、違った結果が返ってきます。このように挙動が変わってしまいます。0最後に、書いたスクリプトを実行してみましょう。リスト9のような出力になることも理解できると思います。処理できませんでした。チェックを実装する¶では、ADDMEMBERに次のチェック項目を実装してみましょう。入力のデータがちゃんと二列になっているかメールアドレスについて、文字列と文字列の間に@がついているかある文字列がメールアドレスかどうかという判断は大変です。そこに通して判断させるということを考えないといけません。ここでは簡素に済ますことにします。リスト10が上記2点を実装したものです。19,20行目でフィールド数を確認します。gyoはレコードの数、retuはフィールド数を出力するものです。リスト11に使用例を示します。書くと1が出力されます。20行目でフィールド数が2であることを調べています。切り出して、grepで条件に合うものを抽出しています。25行目で、もとのレコード数と抽出された電子メールのレコード数を比較しています。動作の確認¶スクリプトを書いたら、挙動を確認してみましょう。適切に出力されることを確認してみます。処理できませんでした。処理できませんでした。本来やりたいことである新規会員の追加処理を書きましょう。こちらにもエラーチェックは必要です。ファイルを更新するときは神経を使わなければなりません。tmp=/home/ueda/tmp/$$(リスト10の5~26行目。0リスト9にスクリプト全体を示します。新しいリストを作成しています。15行目のawkの使い方でしょう。dirnameコマンドは、このスクリプトのあるディレクトリを出力します。このスクリプトでは、MEMBERファイルの場所を特定するために使っています。http://d.hatena.ne.jp/Rocco/20071031/p2)。23行目から31行目までで、しつこくチェックをします。第一回でも使いましたが重複するレコードを抽出するために使っています。更新前のファイルのバックアップをとっています。しておけば、何かあっても安心です。致命的なことになりにくいという性質があります。スクリプトが途中で止まれば重要なファイルは守られるという性質があります。ホームのバックアップは必須ですが・・・。最後に、スクリプトを動作させて、今回は終わりにします。処理できませんでした。今回は、ファイルの追記を自動化するためのスクリプトを書きました。記号など、ややこしいものが出てきました。これらの記号は一般的なプログラミング言語に比べると洗練されたものとは言えません。楽に処理を書くことができると考えています。AdSenseやその他ソーシャルボタンのためにCookieを使用しています。同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。