awkの基本形
シェルに組み込むこともよくあるであろうスクリプト言語、awkについてあらためて基本をまとめてみる。BIGINはスクリプトを初期化する働きがある。ENDに伴うアクションはawkが処理を終えた後に一度だけ実行される。
シェルに組み込むこともよくあるであろうスクリプト言語、awkについてあらためて基本をまとめてみる。BIGINはスクリプトを初期化する働きがある。ENDに伴うアクションはawkが処理を終えた後に一度だけ実行される。
バッチ処理用にシェルスクリプトを作成したら、通常cronに登録する前に手動で動作確認をするだろう。手動だと上手くいったのに、cronだと動作しない、あるいは一部がエラーになる、という状態になったら。
容量の単位を変換するシェルの例。
バックグラウンドジョブのプロセスをkillするためのシェルをつくってみた。
以下のスクリプトでは、TERMでkillできなかった時のためQUIT,KILLをシグナルとして代入できるようにし、バックグラウンドジョブをカウントして0ならそのまま終了。ジョブがあれば、「kill シグナル PID」が実行される。ジョブのプロセスが終了するのに少し時間がかかる可能性があるため、最後にsleepでシェルを一時停止させる。
killjob.sh
練習用に、ループ状態を作り出すためのシェルloop.shを作成。バックグラウンドで実行し、スクリプトでkillしてみる。ジョブ制御はシェル単位なので、現在のシェルのジョブを終了するにはsourceか.で実行する必要がある。
実行例
$ ./loop.sh &
[1] 8085
$
$ jobs
[1]+ Running ./loop.sh & ←ジョブ実行中
$
$ . killjob.sh
[1]+ Terminated ./loop.sh ←ジョブが終了した
$
$ jobs
$
シェルスクリプト練習記録。
Linuxのコマンドライン上でゴミ箱を実現するためのスクリプトは、入門編の参考書に
よく登場するみたいだ。2パターンを、それぞれちょっとずつアレンジして作成してみた。
※garbage.sh,garbage2.sh
両方とも、オプション・引数が入力されなかった場合のメッセージ出力と、
ゴミ箱ディレクトリとなる「.garbage」が存在しなかったらmkdirで作成する、というところまでは一緒。
garbage.sh
以下実行編。
ファイル名を引数として指定してゴミ箱ディレクトリ「.garbage」に移してから、
-eオプションで消去、という流れ。同名のファイルがゴミ箱に移されたら、
日付時刻をファイル名に付与する。
こちらはファイルがゴミ箱に移された時点で同名のファイル有る無しに関らず、
ファイル名に日付時刻が付与される仕様。
「-f ファイル名」と指定すると、確認をせずにゴミ箱へ移される。
この機能はなくてもいいと思うが。。
garbage2.sh
実行例。garbage.shと流れは同じ。
空のディレクトリを削除するシェルスクリプトを作成してみた。
printfコマンドはデータを整形して出力する。echoコマンドより詳細を指定できるので、平たくechoコマンド応用版と捉えておいてもいいだろうか。
evalコマンドは、引数で渡された文字列をコマンドとして実行する。その際コマンドライン展開を2度行うということは、覚えておいた方が良さそうだ(これにより変数にセットされたパイプやリダイレクトが実行可能になる)。
exprコマンドは与えられた文学列の中に、与えられた正規表現にマッチする部分があるかどうか」をチェックする。基本的な書式は、「expr 文学列 : 文学列(または正規表現の条件)」となる。
シェルスクリプトにおいて、「配列」は変数に番号をつけたもの、と捉えておくとわかりやすい、、、かもしれない。
コマンドラインの展開についてメモ。シェルは入力されたコマンドを実行する前に、受け取った文学列を以下の順番で展開し、処理をする。
returnはシェルスクリプトにおいて関数の終了ステータスを指定するコマンド。returnコマンドを使用しない場合の関数の終了ステータスは、関数内で最後に実行されたコマンドのステータスが採用される。
readコマンドは標準入力から文学列を読み込み、変数にセットする。シェルスクリプトでユーザからの回答によって処理を分岐させたい場合に利用される。
historyコマンドは実行したコマンドの履歴を表示する。historyの処理を制御する変数はsetコマンドで確認できる。
trueコマンドは何もせずに終了し、ステータス0を返す。「:」(コロン)でもtrueと同様の働きをする。シェルスクリプトにおいてループ処理を継続させるために、while文などで利用される。
ジョブ関連のシェルビルトインコマンドについてざっくりメモ。プロセスとジョブの違いは、Linuxカーネルが処理する単位がプロセスで、ユーザにとって判りやすくした処理の単位がジョブ、と捉えておくとよい。
ビルトインコマンドはシェルに組み込まれているコマンド。ソフトウェアとしてbashに含まれており、ファイルとしては存在しない。よってwhich、whereisコマンドでパスを探しても結果は得られないが、typeコマンドでビルトインか外部コマンドかの確認ができる。
シェルにおける変数展開について。変数展開{ }(ブレース)の中で各種文学列演算子を使い、変数の存在や値をチェックすることができる。
シェルスクリプトにおいて、関数は1つ以上の処理に名前をつけて定義したもの。関数の定義が読み込まれるとメモリに常駐するため、一度読み込まれた関数は高速に動作し、削除しない限り何度でも繰り返しの利用が可能となる。
select文は対話的なスクリプトで、ユーザに何らかの入力を促すための構文。ユーザに選択候補を提示しリストの中から1つをユーザに選択させ、その選択結果を変数に代入する。