シェルスクリプトに挑戦しよう(7)制御構文[その1]――ifによる条件分岐“応用力”をつけるためのLinux再入門(27)(2/2 ページ)

» 2018年10月24日 05時00分 公開
[西村めぐみ@IT]
前のページへ 1|2       

●if文の改行ルール

 if文の場合、「then」と「else」のブロックの最後は改行する必要があります。改行したくない場合は「;」記号を使用します。例えば、thenだけの行があると縦に長くなってしまうので、「;」記号で区切ると読みやすくなります。

 thenやelseのブロックで複数のコマンドを実行する場合も、改行または「;」で区切ります。この方法で、本連載第25回で作成した「grepall」スクリプトを書き換えると、以下のようになります。

#! /bin/bash
if [ -n "$1" ]; then
  ptn="$1"
else
  echo "USAGE: `basename $0` pattern [file] [dir]"
  exit
fi
if [ -n "$2" ]; then
  file="$2"
else
  file="*"
fi
if [ -n "$3" ]; then
  dir="$3"
else
  dir="."
fi
grep -Hn -e "$ptn" -r --include="$file" "$dir"
▲「;」記号でthenの前の改行をなくす(第25回の「grepall」を加工)

 少々極端な例ですが、それぞれのif文を1行にすると以下のようになります。読みやすさと、後で処理を変更する際の編集しやすさを考えて調整しましょう。

#! /bin/bash
if [ -n "$1" ]; then ptn="$1"; else echo "USAGE: `basename $0` pattern [file] [dir]"; exit; fi
if [ -n "$2" ]; then file="$2"; else file="*"; fi
if [ -n "$3" ]; then dir="$3"; else dir="."; fi
grep -Hn -e "$ptn" -r --include="$file" "$dir"
▲それぞれのif文を1行にした(grepallを加工)

条件文の中に条件文を書く(if文のネスト)

 if文の中にif文を書くことがあります。これを“if文の「ネスト」(nest:入れ子)”と表現することがあります。

 先ほどのgrepallスクリプトを、if文で引数の数を見ながら処理をするように書き換えてみましょう。スクリプト名は「grepall2」とします。

#! /bin/bash
if [ $# -ge 1 ]; then
  ptn=$1
  file="*"
  dir="."
  if [ $# -ge 2 ]; then
    file="$2"
    if [ $# -ge 3 ]; then
      dir="$3"
    fi
  fi
  grep -Hn -e "$ptn" -r --include="$file" "$dir"
else
  echo "USAGE: `basename $0` pattern [file] [dir]"
fi
▲if文のネスト(grepall2)

 “if文の中にif文”のように、あるブロック(ひとまとまり)の中に別のブロックを入れるような場合は、内側のブロックの先頭に空白を入れると読みやすくなります。これを“インデント”と呼びます。

 シェルスクリプトでは、「空白を入れてよい場所には幾つ入れてもよい」「行頭に空白を入れてもよい」というルールがあるため、このように書くことができます。ただし、処理はあくまでもifからfiまでが1つのブロックとなりますので、インデントを間違えてしまうと逆にとても読みにくいスクリプトになってしまうので注意しましょう。

 “引数の個数が1以上”という条件は、「[ $# -ge 1 ]」と表現できます。「ge」は「greater or equal」の略です。[ ]の前後も含め、それぞれの空白は必須です。

 条件の書き方についてはこの後の回で取り上げます。連載『Linux基本コマンドTips』の「test」コマンド(基礎編応用編)も参考にしてください。

筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。