第6章:コマンド行の解析、処理

始めに

第6章はコマンドラインの処理とからしい。渋い。この章はページが15ページほどなので、気軽に読めそう。10章のサンプルスクリプトまで、あともーすこし。週末までには何とかたどりつきたなぁ。

コマンドラインの復習

コマンドラインは、最初にコマンドがきて、その後に引数がくる。引数と引数の間に空白があると別の引数として認識されるため、もし1つの引数で間に空白がある場合は下記のようにクォーティングしておく。

command "Hello World"

バックスラッシュで改行をエスケープできるので、下記のように1つのコマンドを複数行に分けて書くことができる。

echo "part one;" \
          "part two."

上記のコマンドと下記のコマンドは同じ

echo "part one;" "part two."

シェルスクリプトでのオプション処理

シェルでオプションを解析したりするにはgetoptsコマンドを使用する。getoptsコマンドの書式は以下の通り。

getopts fv: OPT

シェルスクリプトで使用できるオプションに引数が必須の場合には「:」をつける。上記の例だとvオプションの場合には引数が必須となる。もし、vとxが引数が必須の場合には下記の例となる。

getopts abv:x: OPT

処理を行うときは変数OPTにオプション(fやv)が入り、スクリプトはそれを1つ1つ処理していく。引数に関してはgetoptsが用意した$OPTARGに格納される。変数OPTINDもgetoptsの用意している変数で、OPTINDには最後のパラメータの位置パラメータが格納されてる。

getoptsがないとき

getoptsがないときには、getoptが使用される。getoptsはgetoptの拡張版なので、そんな違いはなさそう。もし出くわしたときにはP148を見ればgetoptコマンドの解説が載っているので、それでも見よう。

その他のオプション処理方法

引数処理では、引数の数が重要になる場合、$#が引数の数を持っている変数なので、この変数を利用し引数の数をチェックする。
もし、個数の定まらない引数の場合には下記のように引数チェックを行う。

while [ $# -gt 0 ]
do
        FILE=$1
        shift
        ・・・
        ・・・
done

for文で同じことを行うなら

for FILE
do
        ・・・
        ・・・
done

上記のように変数に値を与えるリストを書かなかった場合、変数(上記の例だとFILE)に位置パラメータが順に格納されていく。しかし、引数に空白などが含まれている場合などはfor FILE in "$0"と正確にやった方がいい。

ifの条件式

そろそろ、if文の条件式が=(イコール)以外のものが当たり前のように出てくるようになってきました。今後のためにも下記にまとめておきます。

  • A = B AとBが等しい場合、真を返す
  • A -eq B AとBが等しい場合、真を返す(=と同じ)
  • A -ne B AとBが異なる場合、真を返す
  • A -gt B AがBより大きい場合、真を返す
  • A -ge B AがB以上大きい場合、真を返す
  • A -lt B AがBより小さい場合、真を返す
  • A -le B AがB以下小さい場合、真を返す

終わりに

この第6章自体は短かったのだが、getoptsコマンドのshiftがなかなか理解できなくて結構時間がかかりました。理解できるまでshiftしまくりでした。。。あとはそんなに難しくなかったように思います。やっと「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」が半分終了でございます。まだまだ書き方の解説のページが続きそうですが、地道にがんばりたいと思います。

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

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