server-memo.net

【シェルスクリプト】(条件分岐)if文

   

シェルスクリプトにおけるif文の使い方です。

if文

if文を使用することで条件式の結果によって真・偽の分岐を行い、決められた処理を実行することができます。

条件式には「test」コマンド([ ]でも代用可能)を使用することが多いですが、その他のコマンドを使用することも可能です。

testコマンドを使用した記述例です。

if test $NUM1 -eq $NUM2 ; then
  echo 'NUM1 equal NUM2'
fi

こちらは[]を使用した記述例となります。
「[」の直後と「]」の直前には半角スペースが必要なので忘れないようにしてください。

if [ $NUM1 -eq $NUM2 ]; then
  echo 'NUM1 equal NUM2'
fi

どちらも同じ内容の「NUM1」と「NUM2」の中身が等しいかどうかを判別する条件式となります。

if文の書き方

if文には大きく分けて下記3パターンがあります。
各パターンの使用方法を説明していくので必要に応じて使い分けてください。

  • if then fi
  • if then else fi
  • if then elif then else fi

パターン1 if then fi

このパターンは条件式が真の場合のみ指定された処理を行い、それ以外の場合は何も行いません。

if 条件式 ; then
  処理
fi

「NUM1」と「NUM2」の値を比較して等しい場合にメッセージを表示するというスクリプトを、「NUM1」と「NUM2」の値が同じ場合と異なる場合の、2パターン作成してそれぞれの実行結果を確認してみます。

NUM1とNUM2の値が同じ場合

「NUM1」と「NUM2」に同じ値を格納したスクリプトを作成します。
※「-eq」が左右の数値が等しいかを判断するための条件式となります。

#!/bin/bash
NUM1=10
NUM2=10

if [ $NUM1 -eq $NUM2 ]; then
  echo 'NUM1 equal NUM2'
fi

実行すると「NUM1」と「NUM2」の値が同じなので、条件式の判別結果は真となり「echo 'NUM1 equal NUM2'」の処理が実行され「NUM1 equal NUM2 」というメッセージが表示されました。

$ sh if_1.sh
NUM1 equal NUM2
NUM1とNUM2の値が異なる場合

次に「NUM1」と「NUM2」を異なる値に変えて実行してみます。

#!/bin/bash
NUM1=10
NUM2=20

if [ $NUM1 -eq $NUM2 ]; then
        echo 'NUM1 equal NUM2'
fi

「NUM1」と「NUM2」が等しいという条件に当てはまらなかったので、条件式の判別は偽となり処理はスキップされて何も表示されません。

$ sh ./if_2.sh

パターン2 if then else fi

このパターンは、条件式が真の場合に処理1を行い、それ以外の場合は処理2を行います。

if 条件式 ; then
     処理1
else
     処理2
fi

「NUM1」と「NUM2」の中身が同じ場合かどうかを判別し、同じ場合と異なる場合によって表示させるメッセージをかえるというスクリプトを、「NUM1」と「NUM2」の値が同じ場合と異なる場合の2パターン作成して実行していきます。

NUM1とNUM2の値が同じ場合

「NUM1」と「NUM2」に同じ値を格納したスクリプトを作成します。

#!/bin/bash
NUM1=10
NUM2=10

if [ $NUM1 -eq $NUM2 ]; then
        echo 'NUM1 equal  NUM2'
else
        echo 'NUM1 not equal NUM2'
fi

「NUM1」と「NUM2」が同じ値であるため、条件の判別結果は真となり、処理1部分の「 echo 'NUM1 equal NUM2'」が実行され、「NUM1 equal NUM2」というメッセージが表示されています。

$ sh ./if_3.sh
NUM1 equal  NUM2
NUM1とNUM2の値が異なる場合

「NUM1」と「NUM2」の値が異なるスクリプトを作成します。

#!/bin/bash
NUM1=10
NUM2=20

if [ $NUM1 -eq $NUM2 ]; then
        echo 'NUM1 equal  NUM2'
else
        echo 'NUM1 not equal NUM2'
fi

「NUM1」と「NUM2」が異なる値であるため、条件の判別結果は偽となり、処理2部分の「 echo 'NUM1 not equal NUM2'」が実行され、「NUM1 not equal NUM2」というメッセージが表示されます。

$ sh ./if_4.sh
NUM1 not equal NUM2

パターン3 if then elif then else fi

条件式1が真の場合は処理1を行い、条件式1が偽で条件式2が真の場合は処理2を行い、それ以外の場合は処理3を行います。

if 条件式1 ; then
     処理1
elif 条件式2 ; then
     処理2
else
     処理3
fi

判別する条件式を増やしたい場合は、「elif」を追加することで分岐を増やすこともできます。

「NUM1」と「NUM2」の値を比較して中身が「等しい」か「NUM1」の方が「大きい」か「それ以外」(小さい)かによって表示するメッセージを変えるというスクリプトを、それぞれの条件にあう3パターン作成して実行していきます。

NUM1とNUM2の値が等しい場合

「NUM1」と「NUM2」に同じ値を格納したスクリプトを作成します。

#!/bin/bash
NUM1=10
NUM2=10

if [ $NUM1 -eq $NUM2 ]; then
  echo 'NUM1 equal  NUM2'
elif [ $NUM1 -gt $NUM2 ]; then
  echo 'NUM1 greater than  NUM2'
else
  echo 'NUM1 smaller than NUM2'
fi

「NUM1」と「NUM2」が同じ値であるため条件式1の判別結果は真となり、処理1部分の「 echo 'NUM1 equal NUM2'」が実行され「NUM1 equal NUM2」というメッセージが表示されています。

$ sh if_5.sh
NUM1 equal  NUM2
NUM1とNUM2の値が異なる場合

「NUM1」に「NUM2」より大きな値を格納したスクリプトを作成します。

#!/bin/bash
NUM1=10
NUM2=5

if [ $NUM1 -eq $NUM2 ]; then
        echo 'NUM1 equal  NUM2'
elif [ $NUM1 -gt $NUM2 ]; then
        echo 'NUM1 greater than NUM2'
else
        echo 'NUM1 smaller than NUM2'
fi

「NUM1」の方が「NUM2」よりも大きい値であるため条件式1の判別結果は偽となり、条件式2の判別結果は真となるため、処理2部分の「 echo 'NUM1 greater than NUM2'」が実行され「NUM1 greater than NUM2」というメッセージが表示されています。

$ sh ./if_6.sh
NUM1 greater than NUM2
NUM1とNUM2の値が等しくも大きくも無い場合

「NUM1」に「NUM2」より小さな値を格納したスクリプトを作成します。

#!/bin/bash
NUM1=10
NUM2=20

if [ $NUM1 -eq $NUM2 ]; then
        echo 'NUM1 equal  NUM2'
elif [ $NUM1 -gt $NUM2 ]; then
        echo 'NUM1 greater than  NUM2'
else
        echo 'NUM1 smaller than NUM2'
fi

この場合、条件式1と2の判別結果がそれぞれ偽となるため、処理3部分の「echo 'NUM1 smaller than NUM2'」が実行されて、「NUM1 smaller than NUM2」というメッセージが表示されています。

$ sh ./if_7.sh
NUM1 smaller than NUM2

testコマンドの比較条件

「test」コマンドは条件式の真(0)・偽(1)を判別してその結果を返すコマンドです。
使用できる比較条件は数多くありますが、いつも忘れてその都度調べる羽目になるので普段使いそうな物を抜粋してメモしておきます。

数値の比較条件

条件 比較内容
数値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以下の場合に真

文字の比較条件

条件 比較内容
-n 文字列 文字列の長さが0より大きい場合は真
-z 文字列 文字列の長さが0ならば真
文字列1 = 文字列2 文字列1と2が等しい場合は真
文字列1 != 文字列2 文字列1と2が異なる場合は真

ファイルの比較条件

条件 比較内容
ファイル1 -nt ファイル2 ファイル1がファイル2より新しく作成・更新されていた場合は真
ファイル1 -ot ファイル2 ファイル1がファイル2より古く作成・更新されていた場合は真
-d ファイル ファイルが存在してディレクトリであれば真
-e ファイル ファイルが存在していれば真
-r ファイル ファイルが存在して読み込み許可されていれば真
-w ファイル ファイルが存在して書き込み許可されていれば真
-x ファイル ファイルが存在して実行可能であれば真

ANDとORとNOT

  • ! 条件式 条件式が偽なら真(NOT)
  • 条件式1 -a 条件式2 条件式1と2のどちらも真なら真(AND)
  • 条件式1 -o 条件式2 条件式1か2のどちらかが真なら真(OR)

 - シェルスクリプト