2008年11月8日土曜日

シェルスクリプトお試し

シェルスクリプト・・・なんか名前は知ってるけどややこしそうで手を出してなかった代物。
でも、あまりにめんどくさい作業をしなくてはいけなくなって、これを使うとそのへんが自動化できそうなので手を出してみた。

シェルスクリプトはWindowsでいうところのバッチファイルみたいなもんで、基本的にはLinuxのコマンドを羅列していく。それにくわえて、while do~done やif ~fiといったループや条件分岐もかけるし、$1,$2といった記述で実行時に引数を渡すこともできるらしい。なのでおんなじような作業でちょっとだけちがうっていう自力でいちいちコマンド打っていくには超めんどくさい作業を大半自動化することができる。
もっとも基本的ルールは冒頭に#!/bin/shを書いておく、拡張子は.shな模様(bashを使う場合)

今回自動化したかったのはだいたい

・プログラムのあるパラメータだけを変化させたバージョンをそのパラメーターに合わせた名前を持つフォルダに移動して実行。

・フォーマットしたデータをおさめたファイルrev***.txt全部を***.txtって名前にしてnewってフォルダ下にコピーする
の2点。たぶんこういう場面には今後もよく出くわすので解決しとくと以後楽だろう・・・

なので、sedをシェルスクリプトの引数をどう組み合わせて使うかってゆーのと、ファイル名の取得+一部分を切り出してきて使うのをどうするかってのが問題になった。

sedの実行文のなかでシェルスクリプトの引数とどう組み合わせるかの例
sed 's/a=3.0/a='$1'/g' "aaa.txt" > "newaaa.txt"
aaa中のa=3.0の部分がa=$1に変換されたnewaaa.txtっていうファイルができる。
$1は''で囲っておかないとイケナイ。sed実行文も''で囲っておく。
($1はシェルスクリプト実行時に./aaa.sh 5.0 みたいにしてシェルスクリプトの名前打った後につづけて入力して与える)

条件に合う全ファイルの検索+ファイル名を変数に格納、必要な部分のみを取り出して新しいファイルの名前にしてnewってフォルダにコピーていう例
# revから始まるテキストファイルをフォルダ内で検索、filenameにパス付でファイル名を格納
find . -maxdepth 1 -type f -name 'rev*.txt' | while read filename;
do
echo $filename #filenameは./revaaa.txtみたいにパスまでついてる
# ./rev以降を読み込ませるために、cオプション、6文字以降を読むように。
newname=`echo $filename | cut -c 6-`
echo $newname
cp $filename ./new/$newname
done

これくみあわせて自分は./aaa.sh 5.0とか打つだけ一発で作業が終わるようになった。
ってこれ調べてる間に実はこつこつ作業してたらとっくに終わってる気もするんだが、単純+メンドイことはなるべくしたくないし。なんか得してんか損してんだか。

0 コメント: