Skip to main content.

Tuesday, June 07, 2011

結局前回は、シェルスクリプトは紹介程度で終わってしまいましたが、今回こそシェルスクリプトを使います(^^;)。

前回のおさらい


・アクション間のデータのやり取りはテキストデータの配列(らしい)。
・次のアクションに受け渡すデータは、"結果"のテーブル表示で見ることができる。
以上。

前回の続きから


前回最後にアプリケーション化したfilelister.appを、AutomatorにDrag&Dropして開きます。


前回のプログラムでは、サーバールートからのパスが表示されてしまうので、サーバールートからフォルダ位置までのパスを削除することを考えましょう。

ユーティリティ>【シェルスクリプトを実行】
を【フォルダの内容を取得】と【新規テキストファイル】の間に挿入します。


そうだ、perlでいこう


シェルスクリプトと言っても、実は使えるシェルは何種類も用意されています。

"シェル"をクリックすると
・bash
・csh
・ksh
・sh
・tcsh
・zsh
・perl
・python
・ruby
が選べることがわかります。
え?Perlって・・・Pythonって、Rubyってシェルなの?!と言う疑問はさておき、Perlやその兄弟分のPython、Rubyなど強力なプログラム言語が使えるのは非常に心強い。私は古くからPerlに慣れ親しんでいるので、Perlでやっちゃいます。BashやCsh、Python、Rubyがいいという方は適時読み替えて進んでください(^^;)。
これから習おうというのであれば、Pythonが一番いいかもしれません。ShadeやMaya、CINEMA 4D、Vue、Poserなど多くのCGアプリで利用できるスクリプト言語といえばPythonで決まりですし、BattleFieldやEVE Online、Civilizationなど、GAME拡張用の組込言語にまでPythonは使われています。また、標準ライブラリが非常に充実しており、システム管理用のスクリプトとしても強力なのも魅力。GoogleやFacebookなどでも使われており、今もっとも勢いのある言語とも言われています。

ということで、将来性はPythonが高そうなものの、ここではシェルのタイプにperlを選んでください。

データ受け取りは標準入力か引数の2種類


シェルスクリプトでデータを受け取る方法は2種類あります。
・標準入力:(stdinへ)
・引数  :(引数として)

どちらでもいいのですが、Perlで使用する場合は引数を利用した方が安定している(様な気がする)ので、ここは引数を利用しましょう。
"入力の引き渡し方法"から"引数として"を選択します。

perlでは、引数としてデータを受け取ると、@ARGVという特殊配列変数にデータが格納されます。また、データを次のアクションに渡すには標準出力のprint(またはecho)を使います。

複数のデータが渡されてきた場合、ループで全部引き出すには、
foreach (@ARGV) {
print "$_\n"
}

とすることで、全てのデータを引き出し、次のアクションにデータを引き渡せます。


1個1個データを引き出す場合は
$var1 = shift @ARGV;
$var2 = shift @ARGV;
$var3 = shift @ARGV;
print "$var1\n";
print "$var2\n";
print "$var3\n";

の様にすることで頭から順に必要な数だけ引き出せます。


ちなみに、標準入力を選択した場合、データはファイルハンドル<>にセットされます。
複数のデータをループで全部引き出す場合は、
while (<>) {
print $_;
}

1個1個データを引き出す場合は
$var1 = <>;
$var2 = <>;
$var3 = <>;
print $var1;
print $var2;
print $var3;

の様に記述します。

正規表現で置換!置換!


さて、filelisterのプログラムに戻ります。
"サーバールートからのパス"記述を"指定したフォルダからのファイルパス"にしたい場合、"指定したフォルダまでのパス"を削除してしまえばよくなります。
ここで、Perlの置換演算子s/検索文字列/置換文字列/を使います。上の例では検索文字列に/Users/iwashiro/Sites/base/を、置換文字列にから文字を指定すれば、"指定したフォルダまでのパス"を削除してくれます。
$folder_path = "/Users/iwashiro/Sites/base/";
foreach (@ARGV) {
s/$folder_path//;
print "$_\n"
}

とすれば、余分なパスだった"/Users/iwashiro/Sites/base/"が削除され"指定したフォルダからのファイルパス"になります。


しかし、このままでは汎用性がありません。
言うまでもなく、他の場所に保管されているファイルリストを作ろうとした場合、$folder_pathを毎回書き換えなければならないからです。

そこで全体を見回し見ると、一番最初の【Finder項目の選択を求める】の結果で、フォルダパスが引き渡されているのがわかります。

ところが、次の【フォルダの内容を取得】の結果をみると、フォルダパスのデータは食べられて無くなり、そのかわりにフォルダに含まれているファイルのパスになっています。
なんとか、フォルダパスのデータを途中で消えないようにしてシェルスクリプトに持って行ければいいのですが・・・

通常のアクションは、入力データを食べてしまう


どのアクションも基本的には入力と結果が設定されています。入力されたデータは内部の処理に使われ、結果のデータからは消えているのが普通です。

しかし、例外があります。
ユーティリティ>【変数の値を取得】
ユーティリティ>【変数の値を設定】
のアクションです。


これは、Automator独特の変数機能で、保存するにも取得するにもアクションを介して行います。
この変数アクションを使うことで、食べられてしまう運命の"フォルダパス"データを、シェルスクリプトに伝えるデータの中に割り込ませることが可能になります。

次回は、このちょっと変わったAutomatorの変数機能を利用してfilelisterを完成させたいと思います。

今回のまとめ


・シェルスクリプトには、PerlやPython、Rubyなど強力なプログラム言語が使用可能
・データの受け取り方は、標準入力か引数の2方法
・データの引き渡しには、標準出力を使う
・通常のアクションは入力データを食べてしまう

以上。

(Visitor:166662)

Comments

No comments yet

Add Comment

:

:
: