
シェルスクリプトにおけるif文の基本的な考え方から使い方、応用に至るまでのif文のすべてを解説します。
シェルスクリプトで複雑な処理を記載したい場合、if文は重要となる構文のひとつです。if文を使いこなすことができれば、さまざまな場面に適用できるシェルスクリプトが作成でるようになります。
この記事では、シェルスクリプトにおけるif文の基本的な考え方から使い方、応用に至るまでのif文のすべてを解説します。
シェルスクリプトにおけるif文の考え方
シェルスクリプトにおけるif文の基本知識として、覚えておきたい考え方を簡潔に解説します。
条件分岐をしたい場合に利用する
if文は条件分岐をしたい場合に利用するものです。例えば、入力内容が“30よりも大きい”場合にのみ処理を実行したい場合などに利用します。
if文では条件式を使って真(true/0)か偽(false/1)を判定し、その結果をもとに分岐を実現しています。先程の例でいえば、入力値が35の場合には真を返し、20の場合には偽を返すことで条件に合わせた処理の実行が可能です。
基本的には真の場合に処理を実行しますが、偽の場合の処理を記載することもできます。
testコマンドとの組み合わせが一般的
if文の条件式では、基本的にtestコマンドが利用されます。testコマンドは条件評価に特化したコマンドであり、評価した結果として0か1を返すだけのコマンドです。
例えば、数値の条件評価を行なう場合、次のように利用します。
$ test 35 -gt 30
$ echo $?
上記の例は35が30よりも大きいかを評価する条件式であり、“echo $?”は直前のコマンドの実行結果を返します。その結果は“0”となり、“35は30よりも大きい=真”となります。
if文と組み合わせて利用する際には、省略形として“[]”が利用されることを覚えておきましょう。
シェルスクリプトのif文の使い方(基本)
ここからは具体的にシェルスクリプトにおけるif文の使い方を解説します。まずは必ず覚えておきたい基本的な使い方を見ていきましょう。
if文の基本形
if文の基本形は、“if [ 条件式 ]; then~fi”となります。具体的な書き方は次のとおりです。
if [ 条件式 ]; then
処理内容
fi
“;”は1行で複数のコマンドを記載する際のつなぎの役割を担います。thenはifコマンドとは異なるコマンドであるため、本来は行を分けて記載する必要がありますが、つなげて記載することが一般的であるため、この形で覚えておくとよいでしょう。
また、“if [ 条件式 ]”を記載する際は、それぞれに半角スペースの入力が必要です。Ifと[]をつなげたり、条件式と[]をつなげたりしてしまうとエラーになるため、注意しましょう。
条件に一致しない場合の処理は“else”を使って記載します。具体的な例を交えて書き方を見てみましょう。
if [ 20 -gt 30 ]; then
echo “Over 30”
else
echo “Under 30”
fi
この例では、20が30よりも大きいかを評価しています。結果は偽となり、else以下のコマンドが実行されるため、“Under 30”が出力されます。
覚えておきたい基本の比較演算子
比較演算子は条件式に記載するものであり、評価方法を示すものです。数値だけでなく、文字列の比較にも利用されます。代表的な比較演算子を以下にまとめました。
・数値の比較
比較演算子 | 内容 |
---|---|
数値1 -eq 数値2 | 数値1と数値2が等しければ真(=) |
数値1 -ne 数値2 | 数値1と数値2が等しくなければ真(!=、<>) |
数値1 -gt 数値2 | 数値1が数値2よりも大きければ真(>) |
数値1 -ge 数値2 | 数値1が数値2以上であれば真(>=) |
数値1 -lt 数値2 | 数値1が数値2よりも小さければ真(<) |
数値1 -le 数値2 | 数値1が数値2以下であれば真(<=) |
・文字列の比較
比較演算子 | 内容 |
---|---|
文字列1 = 文字列2 | 文字列1と文字列2が等しければ真 |
文字列1 != 文字列2 | 文字列1と文字列2が等しくなければ真 |
-n 文字列 | 文字列の長さが1以上であれば真 |
-z 文字列 | 文字列の長さが0であれば真 |
数値と文字列の比較では、使用する比較演算子が異なる点に注意してください。
elif文で複数の分岐を実現
elif文を使えば、複数の条件分岐を実現できます。例えば、入力された数値が30の場合、30よりも小さい場合、そうでない場合、の3通りの条件分岐の例を示します。
read INT
if [ $INT -eq 30 ]; then
echo "Equal 30"
elif [ $INT -lt 30 ]; then
echo "Under 30"
else
echo "Other"
fi
入力された数値はINT変数に格納され、if文やelif文で判定されます。上から順に実行され、真が返された時点でその中の処理が実行される仕組みです。
30を入力すれば“Equal 30”が出力され、20の場合は“Under 30”、50の場合は“Other”が出力されます。
シェルスクリプトのif文の使い方(応用)
シェルスクリプトのif文では、さらに複雑な条件を設定することも可能です。if文の使い方の応用編として、その一例を紹介します。
AND、OR、NOTによる複雑な条件式
AND、OR、NOTは複数の条件式を組み合わせて判定するために利用します。例えば、“入力された数値が0でない”かつ“入力された数値が30以下”のような条件式が作れます。
read INT
if [ $INT -ne 0 ] && [ $INT -le 30 ]; then
echo "True"
else
echo "False"
fi
AND、OR、NOTの意味や使い方を以下にまとめました。
条件 | 記載方法 | 意味 |
---|---|---|
AND | -a または && | すべての条件式の結果が真の場合を返す |
OR | -o または || | いずれかの条件式の結果が真の場合に真を返す |
NOT | ! | 真偽を反転して返す |
これらを組み合わせることで複雑な条件式も実現できますが、条件を組み合わせすぎると可読性が落ちるため注意が必要です。できるだけ簡潔に条件式を組立ましょう。
入れ子(ネスト構造)
if文の中にif文が存在する入れ子構造(ネスト構造)も、複雑な条件を実現するために利用されます。先程のANDを使った例を入れ子構造で表すと次のとおりとなります。
read INT
if [ $INT -ne 0 ]; then
if [ $INT -le 30 ]; then
echo "True"
exit 0
fi
fi
echo "False"
上記の例のシェルスクリプトでは、入力された数値が0でない場合に次のif文へ進み、30以下である場合に“True”が表示されます。exitコマンドは処理を終了するためのものであり、“True”が表示された場合はそのままシェルスクリプトを終了します。
ANDを利用した場合と同じ条件分岐が実現できますが、入れ子構造は可読性が落ちやすいため注意が必要です。規模の大きなシェルスクリプトの場合は、条件も複雑になるため入れ子構造が利用される機会が多いといえますが、利用する際には可読性も考慮して記載するようにしましょう。
数値、文字列以外の条件式
ここまで条件式では数値や文字列を比較してきましたが、シェルスクリプトのif文ではファイルの存在やコマンドの実行結果なども条件式に設定できます。その際に利用されるおもな比較演算子は次のとおりです。
比較演算子 | 内容 |
---|---|
-d 対象ファイル | 対象ファイルがディレクトリなら真 |
-f 対象ファイル | ファイルなら真 |
-s 対象ファイル | 対象ファイルのサイズが0でなければ真 |
ファイル1 -ot ファイル2 | ファイル1がファイル2よりも古ければ真 |
ファイル1 -nt ファイル2 | ファイル1とファイル2が等しければ真 |
シェルスクリプトを実行する上で、ファイルやディレクトリの存在確認は重要であるため比較的よく利用されます。ファイルの存在チェックをするシェルスクリプトの例としては次のとおりです。
if [ -f ./script.sh ]; then
echo "file found"
else
echo "file not found"
fi
同一ディレクトリに“script.sh”ファイルが存在するかを確認し、条件分岐を行ないます。その他にも、直前に実行したコマンドの実行結果をもとに条件分岐を行ないたい場合には、ここまでにも登場した“$?”を利用します。
ls -l
if [ $? ]; then
echo "true"
fi
“$?”は直前に実行したコマンドの結果(0/1)を返すため、if文の条件分岐にも利用可能です。
if文をマスターして複雑なシェルスクリプトも書けるようになろう!
シェルスクリプトで条件分岐を実現したい場合には、if文を利用することで簡単に実現できます。まずは基本的な使い方をマスターし、徐々に複雑な条件式も扱えるようになりましょう。
ここまでに紹介した条件分岐はあくまでも一部であり、比較演算子はその他にも存在しています。主要な比較演算子はすべておさえているため、これらを組み合わせて実現したい条件分岐を構成しましょう。
掲載日:2022/02/03
-
仕事を探す -
働き方から探す
-
給与から探す
