第9章:シェル関数の例

始めに

第9章では、実用的なシェル関数を実際に作りながら、シェル関数をどうやって作ればいいかを学習。サンプルもたくさんあるし、今までの文法のおさらいにもなるので、時間を掛けてゆっくりやっていこうとおもいまする。
全体で35ページほどあるので、ぼちぼちやりごたえはありそうでございます。

シェル関数とは

シェル関数は、他のシェルスクリプトから呼び出され、目的にあった応答を返すように作られたもの。通常、拡張子は.shとし、シェル関数のファイルは直接実行するわけではないので、実行権限は必要なく読み取りだけでもいい。
動作確認とかをしたければ、当然、シェル関数を呼び出さないといけいので、呼び出すシェルスクリプトも作成しなければならない。

復習

  • $#
    • 引数の数が入る
  • $?
    • コマンド終了時の終了ステータスが入る
    • 正常終了なばら0
  • .コマンドでの読み込み
    • 現在のシェルと同じプロセスで動かす
  • マイナス(-)での変数代入(p47)
    • 値を代入しないが、そのときだけその値を返す
    • 左辺で指定した位置パラメータに値が入っていないときだけ、その値を返す。
  • OR(||)
    • 左からコマンドを試していき、コマンドが成功したらそれ以上先のコマンドを実行しない。
  • 中括弧({})によるグルーピング
    • { コマンド1 コマンド2}と1行で記載した場合にh、最後のコマンドには;が必要だが、複数行に分けたときには;は必要ない。
    • コマンドがカレントシェルで実行されるが、リダイレクトしたときはサブシェルで実行される。
  • $@
    • 引数全体を示す変数
    • ダブルクォートで括られると、それぞれの引数を1つずつダブルクォートに囲んで展開する。
    • 引数がダブルクォートで括られている場合などに使用する。(p51)

CheckHostname関数

リモートホストpingで生存チェックするための関数。
最終的にコマンドを処理して値を返す関数の場合、コマンドの結果を見て返す値を変えていくよりは、コマンド自体の結果を直接返したほうが楽になる。そのとき、コマンドのメッセージを/dev/nullに入れることを忘れないように。

Clear関数

端末画面をクリアする関数。
コマンドがない場合の処理を学習するための関数。

stty -a

現在使用中のterminalの行数、幅数などが確認できる。以下にサンプルを示す。rowsが行数(サンプルだと24)、columnsが幅数(サンプルだと80)

speed 9600 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
	-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
	-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
	-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
	-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
	eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
	min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
	stop = ^S; susp = ^Z; time = 0; werase = ^W;

DownShift関数

アルファベットの大文字を小文字にする関数
引数の取得方法を学習するための関数

FullName関数

ファイルやディレクトリの完全パス名を表示する関数

  • testコマンドの復習
    • testコマンドの書式は2つ
      • test 比較
      • [ 比較 ]
    • dオプションは、ディレクトリであれば真を返す
    • fオプションは、ファイルであれば真を返す

GetYesNo関数

質問を出して、YesかNoの応答を取得する。

  • echoコマンドのnオプション
    • 改行コードを抑制するオプション

IsNewer関数

  • ファイルのタイムスタンプの復習
    • タイムスタンプは3つ
      • アクセスした時刻
      • ステータスの変更時刻(モードやユーザなどを変更した場合)
      • 修正時刻

このスクリプトは、ファイル内容に変更が加わった修正時刻の比較を行う。

  • testコマンドの復習
    • oオプションはORでのグルーピング
    • nオプションは文字列の長さが0より長ければ真を返す

InNumeric関数

文字列が数値かどうかを判定する関数
exprの終了ステータスとかを使った判定方法を学習

  • exprコマンドの復習
    • 結果が0の数値になるときの終了ステータスは1
    • 結果が0以外の数値になるときの終了ステータスは0
    • 計算できなかったときの終了ステータスは2

IsSystemType関数

システムのタイプが正しいかを判定
特になし。

Prompt関数

応答要求メッセージを出力する関数
特になし。

Question.sh

応答要求のスタイルを定型化した関数
特になし。

終わりに

正直って、やってて一番辛い章でした。。。今まで勉強してきたことが出てきたので、いい復習になったのですが、なにぶん単なる関数ファイルなので実行して確認しようと思っても面倒だし、やっぱしプログラミングは実行してナンボですね。。。
次の第10章は、待ちに待った「シェルスクリプトの例」です。バンバン実行してたのしもーっと。

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界