第7回 バックアップ処理をシェルスクリプトにしてみよう

フォローする

  (著者:Cstap 瀧ヶ平 充

こんにちは、今回は第6回で触れた別ドメインへのバックアップ処理をシェルスクリプトにしていこうと思います。

コマンドライン操作に慣れた方向けの内容になるので少し難しくなるかと思います。

今回はUnix系OSで使われているシェルの一つであるBashを前提として行うため、Windowsユーザの方はCygwinなどのBashが利用できる環境を用意してください。

シェルスクリプトとは

コマンドで逐次実行していた処理をまとめて記述したものです。定型化された処理の自動化などに向いています。

ひとつひとつの処理を積み重ねて書くことで、一連の処理が一度の実行で済むようにできるので便利です。

作成方法

基本的には、実行したい処理を一定のルールに従ってテキストファイルに書き込んでいくだけです。

ただし、そのままだと実行できないので、作成したファイルに実行権限を付与すると完成です。

サンプルの作成

「Hello!」と表示するだけの簡単なサンプルで、シェルスクリプトの様子をつかんでみましょう。

greeting.sh というファイル名で空のテキストファイルを作成して、そこに下記の2行を書き込んでください。

サンプルの実行

作成したファイルと同階層にいることを確認したら、下記の要領でファイルを指定して実行してみましょう。

恐らく、下記のようなエラーが表示されたのではないでしょうか。

これは、指定したファイルを実行する権限がないことで発生したエラーです。

今後作成するシェルスクリプトでも同様のエラーが発生するかもしれませんが、これはファイルの権限の問題なので、以下の要領でファイルに実行権限を付与して対応します。

上記コマンドを実行してから、作成したシェルスクリプトを再度実行してみましょう。

今回は上記のように「Hello!」と表示されたのではないでしょうか。

シェルスクリプトの書き方

上記サンプルでは指定したコマンドをひとつ実行しただけでしたが、もう少し詳細な条件を指定して作成することができます。

以下、シェルスクリプトの書き方をみていきましょう。

shebang の宣言

これは「shebang(シェバン)」と言って、シェルスクリプトを実行するインタプリタ(シェルなど)を指定する部分です。

ここでBashのパスを指定することで、Bashを用いてこのスクリプトを実行することを宣言しています。

シェルスクリプトではこの宣言を一行目に書いて、その次の行から実行するコマンドを書いていきます。

変数

シェルスクリプトおよびシェル上では、一時的な変数を宣言して処理に利用することができます。

上の例ではvariable_namehoge という値を代入しています。

実際に利用する際は、下記のように $variable_name と表記して使います。

シェルでは $variable_name に代入されている値、ここでは hoge と評価してからコマンドを実行します。

つまり、実際には下記のコマンドが実行されるのと同じになります。

パイプライン処理

POSIXに準拠したコマンドは、あるコマンドの実行結果を引きついで別のコマンドを実行する機能を持っています。
(POSIXとは、Unix系OSなどのAPIに関するIEEEが策定した規格のことです。)

| の左側で指定したコマンドの出力は、その右側で指定したコマンドの入力として扱われます。

例えば、 grep は指定した文字列が含まれる行を抽出できるコマンドですが、以下のように使うことで、cli-kintoneで出力されたCSVの中から HOGE を含む行を抽出できます。

コマンド置換

Bashでは別のコマンドの実行結果をコマンドの引数にできます。

例えば、 cat は指定した入力の中身をそのまま出力するコマンドですが、そのコマンドで取り出された foo.txt の中身を変数に格納したい場合、以下のようにすると実現できます。

if 文(分岐処理)

Bash上でも if を使った分岐処理が行えます。

変数 $a が 0 だった場合は F 、それ以外の場合は T を出力、というように処理を分岐させたい場合は以下のようになります。

バックアップ用シェルスクリプトの作成

ここからは、前回紹介したバックアップ処理を実行するシェルスクリプトの作成に取りかかります。

前回のバックアップ操作は下記のような流れでした。

  1. バックアップ元のアプリからCSVを出力
  2. CSVを編集し、1行目の $id を recordid に置き換える
  3. CSVをバックアップ先のアプリにインポート

2回目以降のバックアップと同期は処理が少し変わりますので、まずはこの流れをシェルスクリプトにしていきましょう。

STEP1 変数の準備

まずは、コマンドのパラメータに使う値を変数に格納してしまいましょう。

こうすることで、複数のパターンのアプリであっても変数を変えるだけで対応でき、処理本体に影響なく汎用化させることができますね。

今回はバックアップ元を入力、バックアップ先を出力とみなして、このような変数名にしてみました。

STEP2 コマンドの追加

変数が準備できたら、次はコマンドを書いていきましょう。

CSVの出力とバックアップ先へのエクスポートには、このようなコマンドを実行します。

このコマンドでは $id が残ったままになるので、出力されるCSVをこのままインポートすることはできません。

そこで、 $id を recordid に変更するようにCSVを編集する必要がありますが、この作業もコマンドを使ってなんとかします。

STEP3 コマンドで文字列を置換

一般にUnix系OSのシェルでは、 sed コマンドを用いて文字列を置換できます。多くの場合デフォルトでインストールされていますが、無い場合はインストールしてください。

今回は、CSV一行目の $id を recordid に置換したいので、以下のような形にバックアップ元からのエクスポート部分を書き換えます。

今回追加したコマンドにある 1 s/\$id/recordid/  という部分ですが、これは 1行目の \$id というパターンに一致する部分を recordid に置換する、という命令になります。

sed については $ man sed  を実行することでも詳しく使い方を見ることができます。

STEP4 実行権限の付与

ここまでの作成したシェルスクリプトの全体は以下のようになります。

これを kintone-backup.sh として保存し、以下のコマンドで実行権限を追加してください。

これでバックアップ処理が実行できるはずです。

レコード同期用シェルスクリプトの作成

レコード同期の処理では、バックアップ済のレコードの最新の recordid を確認し、それを基準に新規レコードのバックアップと既存レコードの同期をしていました。

最新の recordid を取得し変数に入れれば、この処理もシェルスクリプト内で完結できます。

STEP1 最新の recordid を変数に格納

前回使用したコマンドを実行して recordid  を確認すると、その出力は以下のようなフォーマットになっていました。

このまま変数に入れるのは難しいので、こちらも sed コマンドで加工します。

これで "30" の部分が出力されるようになるので、先に説明した「コマンド置換」で出力結果を変数に格納します。

これで、変数 $lastRecordId にバックアップ済最新の recordid が格納できるようになりました。

しかし、このままではバックアップ済のレコードがない場合に問題があるので、 $lastRecordId が空だった場合は 0 を代入するように処理を分岐させます。

シェルスクリプトには以下のように記述することになります。

STEP2 レコードをバックアップ・同期する

バックアップは以下のような形でできます。

ここまでで同期用のファイル名を定義していなかったので、新たに変数 $syncFile として同期用のファイル名を代入しておきましょう。

同期は以下のような処理になります。

シェルスクリプトの全体

ここまででバックアップ・同期の両方に対応したスクリプトを作成しました。最後にシェルスクリプトの全体を確認してみましょう。

先に説明したときと同様、作成したファイルを保存し、実行権限を付与することで、シェルスクリプトを実行しバックアップ・同期が可能になります。

シェルスクリプトの作成、いかがでしたか?
次回はこのシェルスクリプトを自動化する部分についてやっていきます。

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

ログインしてコメントを残してください。
Powered by Zendesk