2008/10/13
シェル・スクリプトの基礎知識《その2》
独学Linuxのvine_userです。
「これならわかる!デスクトップLinux」のご購読ありがとうございます。
==============================
シェル・スクリプトの基礎知識《その2》
==============================
いつの間にか,もう10月。涼しい季節になりました。
風邪などひかぬよう,ご注意下さい。
今回は,シェル・スクリプトの2回目です。結構,奥が深いので,
あまり詳しく書くと,難しすぎると思います。なるべく簡単なもの
に絞って,まとめたいと思います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
文字列を変換するスクリプト
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
まず,以下の例は,henkan.shとhenkan.sedというファイルを同じ
ディレクトリに置いておき,テキストファイルの文字列を変換する
スクリプトです。
sedというコマンドを使いますので,インストールされていない場合,
インストール方法を表示するようになっています。
henkan.sedの”s/(変換前の文字)/(変換後の文字)/g”の部分で,
変換したい文字を指定して下さい。
《スクリプト例5-1(henkan.sh)》
ーーー ここから ーーーーーーーーーーーーーーー
#!/bin/bash
SED="/bin/sed"
function usage () {
echo "ファイルを指定して下さい!"
exit 0
}
if [ ! -x $SED ]; then
echo "このスクリプトにはsedが必要です。
次のコマンドでsedをインストールして下さい。
(for Ubuntu)
$ sudo aptitude install sed
(for Fedora)
$ su
# yum install sed
"
exit 0;
fi
if [ ! $1 ]; then
usage
fi
#変換
$SED -f henkan.sed $1
ーーー ここまで ーーーーーーーーーーーーーーー
《スクリプト例5-2(henkan.sed)》
ーーー ここから ーーーーーーーーーーーーーーー
s/one/1/g
s/two/2/g
s/three/3/g
s/four/4/g
s/five/5/g
ーーー ここまで ーーーーーーーーーーーーーーー
実際には,下記のように使います。
$ chmod +x henkan.sh
$ ./henkan.sh (元のファイル名) > (変換後に保存するファイル名)
ここで,> は,出力結果をファイルに保存するもので,リダイレクト
と呼ばれるシェルの機能の1つです。
他にも,出力結果を新たな入力データとして,次のコマンドに受け
渡すパイプ( | )という機能もあります。
上のスクリプトを理解するには,変数・関数・条件分岐・sedコマンド
についての説明が必要です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
変数: 変数名="変数の内容" → $変数
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
シェルでは,コマンドのオプションが長かったり,そのコマンドが
標準以外の場所にあるような場合に,変数として記憶させる機能が
あります。
変数名="コマンドの場所"
以下では,「$変数」で代用できる。
上の例では,SED="/bin/sed" という部分です。以下の部分では,
$SED という形で/bin/sedを省略しています。
ちなみに,シェル・スクリプトでなく,起動時のシェル内の全体で
定義されている変数を,とくに「環境変数」といいます。
標準シェル(bash)で定義されている環境変数は,exportという
コマンドで確認・変更ができます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数: function 関数名 (); { 実行するコマンド群 }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
シェル・スクリプトでは,複数のコマンドをセットにして,新たな
関数を定義することが出来ます。
上のhenkan.shでは,次の部分ですね。
function usage () {
echo "ファイルを指定して下さい!"
exit 0
}
この記述以下の部分で,「usage」というコマンドとして使っています。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
条件分岐: if [条件]; then … fi
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
条件を満たしたときに,if [条件]; thenとfiではさんだ部分に
書かれたコマンドを実行します。
if [ 条件 ];
then
条件が成立した時に実行するコマンド
else
条件が不成立の時に実行するコマンド
fi
上のスクリプトで,[ ! -x $SED ] と書かれた部分は,$SEDつまり
/bin/sedというコマンドが実行可能"でなければ",then以下を実行
するという条件です。「!」は否定を表します。
[ ! $1 ] は,引数でファイルの指定が"ない"ときに,then以下を
実行しなさいという意味です。
条件の指定には,次のようなオプションを使います。
【ファイルパーミッションのチェック】
-r ファイル名 指定したファイルが読み取り可能なら真。
-w ファイル名 指定したファイルが書き込み可能なら真。
-x ファイル名 指定したファイルが実行可能なら真。
【文字列のチェック】
-n 文字列 文字列の長さが0より大きければ真。
-z 文字列 文字列の長さが0なら真。
文字列1 = 文字列2 2つの文字列が等しければ真。
文字列1 != 文字列2 2つの文字列が等しくなければ真。
【数値のチェック】
数値1 -eq 数値2 2つの数値が等しければ真。
数値1 -ge 数値2 数値1が数値2以上なら真。
数値1 -gt 数値2 数値1が数値2より大きければ真。
数値1 -le 数値2 数値1が数値2以下なら真。
数値1 -lt 数値2 数値1が数値2未満なら真。
数値1 -ne 数値2 2つの数値が等しくなければ真。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
文字列を変換する: sedコマンド
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sedは,テキストファイル内の文字列を置換するコマンドで,次の
ような書式で実行します。
sed -e 's/置換前の文字列/置換後の文字列/g' ファイル名
ただし,sedは文字列を置換して端末内に表示させるだけですので,
実際に置き換えて保存するためには,リダイレクトで別のファイル
に保存する必要があります。
dオプションを使って,
sed -e '/^$/d' ファイル名
とすると,空行(^$)を削除することができます。
また,上に挙げた例のように,' '内を別なファイル(sedファイル)
に保存して,以下のように実行することも可能です。
sed -f sedファイル名 ファイル名
他のオプションについては,manページなどを参照して下さい。
(注) $ man sed :Ubuntuなら日本語で表示されます。
==============================
編集後記
==============================
実用的な使用例としては,csvファイルの編集などが考えられます。
エディタで,1つ1つ置換してもいいと思いますが,多くの種類の
文字列を置き換えるには,重宝しそうですね。
大量の変換処理を行う際には,コマンドの威力が発揮されます。
映像ファイルのエンコードも,下手にGUIを使うと,余計なメモリ
を食いますが,そうした処理を低負荷で実行できるのも,コマンド
処理の利点です。
必要なものを必要なだけ覚えておけば,より快適なLinuxライフを
過ごすことができるでしょう。
次回の配信は,10月19日の予定です。お楽しみに!
********************************
■これならわかる!デスクトップLinux(毎週月曜日発行)
■発行者:vine_user
■購読の申し込み・解除 → http://www.mag2.com/m/0000242266.html
■本記事の利用によって生じた結果について当方は一切責任を負いません。
■連絡先メールアドレス:vineuser7@gmail.com
■関連サイト:独学Linux→ http://blog.livedoor.jp/vine_user/
********************************


