シェルスクリプトの条件分岐(if/then/else)

2016年8月1日(更新: 2019年11月10日)

シェルスクリプトで条件分岐を行う方法についてです。

条件によって処理を切り替えたいときは if文 を使います。if文による条件分岐を利用すると、例えば、数値の大きさによって行なう処理を変えるシェルスクリプトを作ることができます。

if文

if文の基本的な書き方は次の通りです。

    if [ 条件 ]
    then
      処理1(条件が満たされたときの処理)
    else
      処理2(条件が満たされなかったときの処理)
    fi
  

ifと書いた後に、半角スペースを挟んで [ を書きます。また、条件の前後にも半角スペースを入れ、最後に ] で閉じます。この3つのスペースを書かないとエラーになります。

数値の大小関係を条件に処理を分岐

実際に数値の比較を条件としてif文を使ってみましょう。次のシェルスクリプトは、実行時引数として渡した数値が100より大きい場合とそれ以外の場合で処理を分けています。

    #!/bin/bash
    if [ ${1} -gt 100 ]
    then
      echo "100より大きいです。"
    else
      echo "100以下です。"
    fi
  

値の比較には下の表にまとめたような、- から始まる略語を使います。

略語 略の元 意味 記号
-gt greater than 左の数値が右の数値より大きいかどうか >
-ge greater than or equal to 左の数値が右の数値以上かどうか
-lt less than 左の数値が右の数値より小さいかどうか <
-le less than or equal to 左の数値が右の数値以下かどうか
-eq equals 左の数値と右の数値が等しいかどうか =
-ne not equal to 左の数値と右の数値が異なるかどうか

文字列の比較

文字列は = を使って等しいかどうかを判別できます。

    #!/bin/bash
    if [ ${1} = "aaa" ]
    then
      echo "aaaが入力されました。"
    else
      echo "aaaではありません。"
    fi
  

= の前に !(エクスクラメーション)をつけると、等しくないかどうかをチェックできます。

    #!/bin/bash
    if [ ${1} != "aaa" ]
    then
      echo "aaaではありません。"
    else
      echo "aaaが入力されました。"
    fi
  

入力の有無を調べるためには空の文字列のチェックがよく使われます。以下のように書きます。

    #!/bin/bash
    if [ -z "${1}" ]
    then
      echo "空です。"
    else
      echo "何かが入力されています。"
    fi
  

-z は、その後に指定された文字列の長さが 0 かどうかを判定します。-z の後に指定するものは文字列でなければならないので、ダブルクオテーションで囲います。こうすれば、たとえ第一引数の中身が数値であっても長さを判定することができます。

ファイルの存在を条件に処理を分岐

実用的な例として、ファイルの存在を条件にして処理を分けるシェルスクリプトを作ってみましょう。

ファイルの存在を確認するには -e を使います。-eの後に存在を確認したいファイルのパスを書きます。

    #!/bin/bash
    if [ -e ファイルのパス ]
    then
      echo "ファイルは存在します。"
    else
      echo "ファイルが見つかりません。"
    fi
  

カレントディレクトリに適当なファイル(例えば test.txt)を作り、存在を確認する場合は次のようになります。

    #!/bin/bash
    if [ -e "test.txt" ]
    then
      echo "ファイルは存在します。"
    else
      echo "ファイルが見つかりません。"
    fi
  

-e の部分を以下のものに変えると、パスで指定されたものに対して様々な判別が出来ます。

文字列 意味
-f パスで指定されたものがファイルかどうか
-d パスで指定されたものがディレクトリかどうか
-s パスで指定されたファイルのサイズが0より大きい(空のファイルでない)かどうか

これ以外にもいくつかあります。

3つ以上の条件分岐

if文を使って3つ以上の条件分岐を行うときは、elifを間に入れて条件を書きます。elifは複数追加出来ます。elif も if と同じように then を次の行に書きます。

    if [ 条件1 ]
    then
      処理1
    elif [ 条件2 ]
    then
      処理2
    else
      処理3
    fi
  

なお、上記のシェルスクリプトの if の部分を elif で書いてしまうとエラーになります。

bash における数値比較

bashシェルを使用している場合はより簡潔な書き方ができるようになっています。次の例は、このページの初めに示した、数値が100より大きい場合とそれ以外の場合で分岐するシェルスクリプトをbashで使える簡単な書き方にしたものです。

    #!/bin/bash
    if ((${1} > 100))
    then
      echo "100より大きいです。"
    else
      echo "100以下です。"
    fi
  

bash では数値比較に不等号が使えます。また、条件の前後に必要だった半角スペースも不要です。

値が等しいかどうかの比較は == で、等しくないかどうかの比較は != です。

練習問題

以下の条件を満たすシェルスクリプトを作ってください。

  • 1つの数値を実行時引数として入力する
  • その数値が100未満であれば「100未満」と表示
  • その数値が1000以上であれば「1000以上」と表示
  • それ以外の数値であれば、入力した数値をそのまま表示
答え(クリックで開く)
      #!/bin/bash
      if [ ${1} -lt 100 ]
      then
        echo "100未満"
      elif [ ${1} -ge 1000 ]
      then
        echo "1000以上"
      else
        echo "${1}"
      fi
    

または

      #!/bin/bash
      if ((${1} < 100))
      then
        "echo 100未満"
      elif ((${1} > 1000))
      then
        "echo 1000以上"
      else
        "echo ${1}"
      fi
    

コメントを残す

メールアドレスが公開されることはありません。