シェルスクリプトを復習した&素晴らしい書籍に出会った

IBM AIX 上で動かすkshシェルスクリプトを書く必要があったので、本を1冊買って復習した。
ここに復習メモを残そうと思っていたが・・・書くことは何もない!
あるとすれば、「この本を見ればわかる!これを読めば大抵の処理は書ける気がする!!」という事実のメモだけだ。
その本がこちら。

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

この本の何がいいかというと、、

  • 基本的な考え方を各大項目の概要の項で理解し易く解説
  • 各項の解説が丁寧:疑問に思ったことの大半をカバーしていると感じた
  • 移植性への考慮:Linux, FreeBSD, Solaris のそれぞれでの使用可否、および代替手段へのリンク。移植性の高いコマンドで開発できるように導いてくれる
  • 目次が良い:各項の概要が1行で記載されているのでリファレンスとして使い易い

その他頻用コマンドのリファレンスは下記の書籍などで補完すればいい。

【改訂新版】 Linuxコマンド ポケットリファレンス (Pocket Reference)

【改訂新版】 Linuxコマンド ポケットリファレンス (Pocket Reference)

・・・とはいえ、やっぱりちょっとだけメモしておくか。笑

シェルスクリプトの1行目

ksh用のシェルスクリプト(./test.shとする)なら下記のように書く。

#!/bin/ksh

1行目に「#!<コマンド>」と記述されていてかつ実行属性をもつようなファイルを実行すると、システムの内部では「<コマンド> <その実行可能ファイル>」が実行される。
つまり、上記例のシェルスクリプトを実行すると、内部的には下記が実行される。

/bin/ksh ./test.sh

すなわち、下記の2つは等価である。

  • 1行目が「#!/bin/ksh」であるファイル ./test.sh を作成し、 chmod +x ./test.sh で実行属性を付与し、 ./test.sh で実行する
  • 1行目が「#!<コマンド>」でないファイル ./test.sh を作成し、 /bin/ksh ./test.sh を実行する

シェルスクリプトの構成

構成要素
  • コマンド
    • 単純コマンド
    • 複合コマンド: if などの構文やサブシェル、関数など
  • パイプライン: 1つ以上のコマンドが | 区切りで接続されたもの
  • リスト: 1つ以上のパイプラインが ; または 改行 で接続されたもの
構成

リストが複合コマンドの一部となるため、循環構造になっている

移植性を考慮した選択

  • 算術式の評価: expr コマンド (※ ( ( ) ) はLinux(bash)のみ)
  • 条件式の評価: test コマンド (= [ ] コマンド)(※ Linux(bash)のみ)
  • コマンド置換: `` (※$( ) はSolaris(sh)で使えない)
  • 一般的なループ: while および until (※for ( (;; ) )はLinux(bash)のみ)ちなみに for in はOK。

出力と終了ステータス

出力と終了ステータスは異なる。
if構文の真偽判定は、条件判定部に記述されたリストの終了ステータスをもって為される。
test コマンドは判定結果を出力ではなく終了ステータス(※ $? で参照できる)で表現している。
関数の return の値も終了ステータスである。 `関数` を実行した場合、他の言語でいうところの戻り値として得られるものは出力内容であって、 return コマンドの引数である終了ステータスではない。