kintone コマンドラインツール (cli-kintone)
(著者:瀧ヶ平 充)
こんにちは、今回は第6回で触れた別ドメインへのバックアップ処理をシェルスクリプトにしていこうと思います。
コマンドライン操作に慣れた方向けの内容になるので少し難しくなるかと思います。
今回はUnix系OSで使われているシェルの一つであるBashを前提として行うため、Windowsユーザの方はCygwinなどのBashが利用できる環境を用意してください。
シェルスクリプトとは
コマンドで逐次実行していた処理をまとめて記述したものです。定型化された処理の自動化などに向いています。
ひとつひとつの処理を積み重ねて書くことで、一連の処理が一度の実行で済むようにできるので便利です。
作成方法
基本的には、実行したい処理を一定のルールに従ってテキストファイルに書き込んでいくだけです。
ただし、そのままだと実行できないので、作成したファイルに実行権限を付与すると完成です。
サンプルの作成
「Hello!」と表示するだけの簡単なサンプルで、シェルスクリプトの様子をつかんでみましょう。
greeting.sh というファイル名で空のテキストファイルを作成して、そこに下記の2行を書き込んでください。
サンプルの実行
作成したファイルと同階層にいることを確認したら、下記の要領でファイルを指定して実行してみましょう。
恐らく、下記のようなエラーが表示されたのではないでしょうか。
これは、指定したファイルを実行する権限がないことで発生したエラーです。
今後作成するシェルスクリプトでも同様のエラーが発生するかもしれませんが、これはファイルの権限の問題なので、以下の要領でファイルに実行権限を付与して対応します。
上記コマンドを実行してから、作成したシェルスクリプトを再度実行してみましょう。
今回は上記のように「Hello!」と表示されたのではないでしょうか。
シェルスクリプトの書き方
上記サンプルでは指定したコマンドをひとつ実行しただけでしたが、もう少し詳細な条件を指定して作成することができます。
以下、シェルスクリプトの書き方をみていきましょう。
shebang の宣言
これは「shebang(シェバン)」と言って、シェルスクリプトを実行するインタプリタ(シェルなど)を指定する部分です。
ここでBashのパスを指定することで、Bashを用いてこのスクリプトを実行することを宣言しています。
シェルスクリプトではこの宣言を一行目に書いて、その次の行から実行するコマンドを書いていきます。
変数
シェルスクリプトおよびシェル上では、一時的な変数を宣言して処理に利用することができます。
上の例ではvariable_name
に hoge
という値を代入しています。
実際に利用する際は、下記のように $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 を出力、というように処理を分岐させたい場合は以下のようになります。
バックアップ用シェルスクリプトの作成
ここからは、前回紹介したバックアップ処理を実行するシェルスクリプトの作成に取りかかります。
前回のバックアップ操作は下記のような流れでした。
- バックアップ元のアプリからCSVをエクスポート
- CSVを編集し、1行目の $id を recordid に置き換える
- 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 として同期用のファイル名を代入しておきましょう。
同期は以下のような処理になります。
シェルスクリプトの全体
ここまででバックアップ・同期の両方に対応したスクリプトを作成しました。最後にシェルスクリプトの全体を確認してみましょう。
先に説明したときと同様、作成したファイルを保存し、実行権限を付与することで、シェルスクリプトを実行しバックアップ・同期が可能になります。
シェルスクリプトの作成、いかがでしたか?
次回はこのシェルスクリプトを自動化する部分についてやっていきます。
このTipsは、cli-kintone Ver 0.10.2 と2020年3月版 kintone で確認したものになります。
Githubからcli-kintone最新版の0.9.2をダウンロードして使ったらログが出力されるようになりました。
他のログが流れてしまうので、ログの出力を止めたいのですが、どこで設定できますでしょうか?
君島様
いつもお世話になっております。
cybozu developer network 事務局です。
発生しました現象についてこちらで確認を行いたいため、お手数ですが
- ご利用PCのOS ( Windows / MacOS / Linux)
- 実行したコマンド (サブドメイン、認証部分は伏せ字で大丈夫です)
を教えていただけますでしょうか。
よろしくお願いいたします。
この部分なのですが、初回実行時でoutputApp側のレコードが空の場合、lastRecordIdは空にならず
当方WindowsのVSCodeのbash仕様、cli-kintoneのバージョンは 0.11.3ですが、環境のせいでしょうか?記事掲載時からの仕様変更でしょうか?
※ちなみに2回目以降のバックアップ時に追加レコードがなかった場合も、同様にbackup.csvに上記エラーメッセージが入ってしまい、このファイルでバックアップを行ってしまうためにエラーが出てしまいます。
bz 様
いつもお世話になっております。
cybozu developer network 事務局です。
おそれいりますが、現状、取得対象のレコードが 0 件のとき、エラーメッセージが CSV に書き出されるのは cli-kintone の仕様となります。
お世話になっております。
質問なのですが、
attachmentDir=<添付ファイルを保存するディレクトリ>の部分のディレクトリは
kintone-backup.shと同じ改装にしたほうが良いでしょうか。
また定義の仕方としましてはこのような形式で入力をしたらよいでしょうか。
C:\cygwin64\home\User
ご教授よろしくお願いいたします。
ishikawayuito 様
お世話になっております。cybozu developer network 運営でございます。
添付ファイルを保存するディレクトリの階層は同じである必要はございません。
(ただし権限などの問題もありますので不慣れであれば同一の階層でいいかと思われます)
> また定義の仕方としましてはこのような形式で入力をしたらよいでしょうか。
pwdコマンドを利用することで現在地がわかりますので、任意の場所に移動してpwdを実行することで確認できます。
恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、
上記試してみてわからないなどありましたら、
ご質問はcybozu developer コミュニティをご活用ください。
よろしくお願い致します。