シェルスクリプトシェルのプログラミングは、ファイルからの入力で行う。コマンドラインからの入力と違い、いくつもの命令を一括して実行していく事ができるというのが利点である。この、いくつもののコマンドを手順に応じて編集したファイルをシェルスクリプトと言う。 シェルは他プログラミング言語と同様に、条件分岐、繰り返しといった制御命令も持っている。これらを用いる事で、複雑な手順を持ったシェルスクリプトを作成する事も可能である。 シェルスクリプト作成シェルスクリプトの文法は、コマンドラインからの入力のそれと基本的に同じである。大きな違いは、シェルスクリプトはまとめてテキストファイルとして記述し、実行する事ができるという点である。 それでは、カレンダーを表示するC-Shellスクリプトを作成してみる。 (viを用いて【List 1】を入力) 【List 1】
シェルスクリプトを実行するにはシェルスクリプトをC-Shellにて実行する方法は2通りある。 (1)C-Shellにファイルを実行させる csh ファイル名 ファイル名を引数としてC-Shellに直接渡してやることで、C-Shellはこのファイルを実行する。 これを、 sh ファイル名 とすれば、B-Shellにて実行することができる。 (今回の 【List 1】はC-ShellでもB-Shellでも理解できるスクリプトであったため、どちらのシェルでも実行可能である。ただしC-ShellとB-Shellには完全には互換性がない) (2)ファイルに実行権を与える chmod +x ファイル名 chmodでファイルに実行権を与えることで、それ以降、ファイル名を指定するだけで実行をさせる事が可能となる。ただし、この 【List 1】は、シェルスクリプト内でどのシェルを用いて実行するかを指定していなかったため、B-Shellにて実行される。 C-Shellで実行させたい時は、シェルスクリプトの行頭にC-Shellにて実行する旨を伝える一文をつけ加える必要がある (C-Shellにて実行したい場合、行頭に追加する) #!/bin/csh コメントをつけるコメント・注釈をつけるには、「#」を用いる。「#」から文末までがコメント文であると解釈される。 echo "コメント文" #コメント文の実験 メタキャラクタの打ち消し特別な意味で解釈される文字をメタキャラクタという。そのメタキャラクタを通常の1文字として表示に使いたい場合、メタキャラクタの特別な意味を打ち消さなくてはならない。それには、以下の3種類の方法がある。
#ちなみに日本語環境ではバックスラッシュは\を用いて表される。
結果 Hello! *** ABC !a$a *** $super \などを取り除けば、それらが特別な意味を打ち消されていないことがわかるだろう。 キーボードからの入力引数の指定が面倒であるfindを、シェルスクリプトを用いて対話型スクリプトとして実行してみる。 【List 2】
1行目:C-Shellで実行するよう指定する 2行目:-nオプションをつける事で、「PATH を入力して下さい」表示後に改行をしなくなる 3行目:set命令により代入を行う。「$<」はキーボードからの入力を意味する。 つまり、キーボードからの入力を変数dirに代入するということである 8行目:変数の頭に$をつける事で、その変数の値を利用している。 配列について配列にセットするには、以下のようにする。 set 変数名 = ( 値1 値2 値3 ・・・ 値n ) (値の区切りには半角スペースを用いる。半角スペースがデリミタ記号であると考えれば良いだろう) 値1を取り出すには、 $変数名[1] とする。 (C言語とは違い、配列は1から始まる事に注意) 値2〜5を取り出すには $変数名[2-5] 全ての値を取り出すには $変数名 or $変数名[*] とする。 配列の個数を調べるには $#変数名 引数の処理についてシェルスクリプトにおいても、起動時に変数を引数として渡す事が可能である。 与えられた引数は自動的にargvというシェル変数に代入される。このargvは通常のシェル変数と同じように使用する事が可能である。
コマンド実行結果を利用するコマンドを実行し、出力された文字を利用したい場合は、コマンドを「`」(=バッククォーテーション)で囲めばよい。 【List 3】
2行目:コマンドを「`」で囲むことでその結果を変数todayに代入することができる 3行目:変数todayの3番目のデリミタ値を文字列に組み込む 結果をファイルに書き出すファイルに書き出すためには「>!」というオプションを利用する。echoやfindなど出力結果のあるコマンドであれば、全てファイルに書き出す事が可能である。 echo "test" >! "abc" testをabcファイルに書き出す。abcファイルが存在していれば破棄。存在しなければ作成する。 これからわかるように、「>!」は強制的にファイルの上書きを行ってしまうので注意が必要である。ちなみに既存ファイルに追加したい場合は「>>!」を使う。 検索結果、検索した時間をファイルに書き出すように 【List 2】を作りなおしてみる。 【List 4】
2行目:変数save_fileに、保存するファイル名を入れる。もちろん、キーボードからの入力としてもよい。以後、保存ファイル名の指定は、変数save_fileを用いる。 9行目:findの結果をファイルに書き出す。 10行目:現在の日付をファイルに書き出す。「>>!」であるので、既存ファイルへの追加となる。 11行目:ファイルへ書きだした結果はディスプレーには表示されないため、catコマンドを用い、ファイルだけでなくディスプレーにも表示をするようにする。 シェル変数を用いた計算シェル変数に、計算した結果を代入したいといった場合は@を使用する。
固定数値や文字列を代入する場合はsetを用い、演算結果を代入する場合は@を用いるという風に使い分けなければならない。 制御文他のプログラミング言語と同じように、基本的な制御文がC-Shellにも用意されている。
【条件文】if 構文 if(条件式1) then コマンド コマンド else if(条件式2) then コマンド コマンド else コマンド コマンド endif 条件式
【List 5】
ファイル検査演算子
【List 6】
論理演算子
【List 7】
【分岐文】switch 構文 switch(変数) case パターン1: コマンド breaksw case パターン2: コマンド breaksw ・・・ ・・・ ・・・ case パターンn: コマンド breaksw default: コマンド breaksw endsw パターンで指定できる文字
【List 8】
【終了命令】exit処理の途中で強制的にスクリプトを終了したい場合に使用する。 【List 9】(引数が無い時処理を終了する)
【ジャンプ命令】goto特定の処理までジャンプさせる事ができる。ジャンプ先にラベルを指定しておき、ジャンプさせる場所にてそのジャンプ先ラベルを指定する。 他言語にも言える事だが、処理の流れがわかりづらくなるので、goto文の使用は控えた方が良い。 【List 10】
【繰り返し文】while-end同一の処理、もしくは類似した処理を、条件が満たされている間に、反復して処理したい場合にwhileを使用する。 構文 while(条件式) コマンド end 条件式が真である間ループする。 【配列の要素をずらす】shift配列の要素を一つずつずらす命令である。shift命令を実行すると、1番目の要素がなくなり、2番目の要素が1番目、3番目の要素が2番目・・・となる。 【List 11】
結果 a b c d e ---------- b c d e ---------- c d e ---------- d e ---------- e ---------- 参照する配列番号を変更するのではなく、配列自体に変更を加えている事に注意しなくてはならない。 【繰り返し文】foreach-end指定した配列の個数だけループを続ける。その時、指定した配列の値を順番に定義変数に代入していく。 構文 foreach 変数 ( 値1 値2 値3 ・・・ 値n ) コマンド end ループはn回繰り返され、1回目のループでは、値1が変数に代入される。2回目は値2が、3回目は値3、n回目は値nが代入されるというわけである。 もちろん、指定する配列は変数であってもかまわない。例えば下のような例の場合である。 【List 12】
結果 a ----- b ----- c ----- d ----- e ----- a b c d e ループする回数は5回。それぞれのループごとに順番に配列の値を代入している事がわかる。 こちらはshiftと違い、値が削除されていくということはない。 |
[はいぱ〜みゅ〜じあむ] TOP PAGE! |