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"
少々極端な例ですが、それぞれの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文の中に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文の中に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ラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.