シェルスクリプト(bash)のif文やwhile文で使う演算子について

  • 3
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

どうも、江川くんです。
今回はシェルスクリプト(bash)のif文やwhile文で使用できる演算子についてとぼとぼ書いていきたいと思います。(実はちょっと眠いので、じゃーって書いていきます。)

更新情報

  • 2016/8/19 新規作成
  • 2916/8/19 表現のわかりにくいところを修正

比較演算子とその仲間

文字列比較演算子

演算子 意味
文字列 文字列の長さが0より大きければ真
-n 文字列 文字列の長さが0より大きければ真
-z 文字列 文字列の長さが0であれば真
文字列A = 文字列B 文字列Aと文字列Bが等しければ真
文字列A != 文字列B 文字列Aと文字列Bが等しくなければ真

使用例

egawa.sh
#!/bin/bash

if [ "ABC" = "ABC" ]; then
  echo "equal"
else
  echo "not equal"
fi

この場合 equal が表示されます。

数値比較演算子

演算子 意味
数値1 -eq 数値2 数値1と数値2が等しければ真
数値1 -ne 数値2 数値1と数値2が等しくなければ真
数値1 -gt 数値2 数値1が数値2より大きければ真
数値1 -lt 数値2 数値1が数値2より小さければ真
数値1 -ge 数値2 数値1が数値2以上であれば真
数値1 -le 数値2 数値1が数値2以下であれば真

使用例

egawa.sh
#!/bin/bash

if [ 100 -eq 99 ]; then
  echo "equal"
else
  echo "not equal"
fi

この場合 not equal が表示されます。

ファイルチェック演算子

演算子 意味
-d ファイル名 ファイル名がディレクトリであれば真
-f ファイル名 ファイルであれば真
-e ファイル名 ファイルがあれば真
-L ファイル名 シンボリックリンクであれば真
-r ファイル名 読み取り可能であれば真
-w ファイル名 書き込み可能であれば真
-x ファイル名 実行可能であれば真
-s ファイル名 ファイルが存在し、空でなければ真
-S ファイル名 ファイルがソケットならば真
ファイルA -nt ファイルB ファイルAがファイルBより新しければ真
ファイルA -ot ファイルB ファイルAがファイルBより古ければ真

使用例

例えば、
/var/log/egawa/egawa.log
ファイルがなければ処理(file not foundを表示)をするが、ファイルがあれば何もしない。

egawa.sh
#!/bin/bash

if [ ! -f /var/log/egawa/egawa.log ]; then
  echo "file not found"
else
  :
fi

上記のように、 -f演算子の前に!をつけることによって否定することも可能ですので、よく覚えておきましょう。
(ファイルがあれば真→ファイルがなければ真)
またelseの後にある:(コロン)のように記述すると、何も処理を行いません。
もし何も処理をしないからといって何も記述しないと、実行時にエラーが出力されます。

結合

演算子 意味
条件A -a 条件B 条件Aかつ条件Bが真であれば、真
条件A -o 条件B 条件Aまたは条件B、どちらかが真であれば、真

使用例

例えば、/var/log/egawa/egawa.logが存在しかつ読み込み可能あれば処理(OKを表示)をするが、存在しないか読み込み不可能であったら処理(ERRORを表示)する。

egawa.sh
#!/bin/bash

elog=/var/log/egawa/egawa.log

if [ -f ${elog} -a -r ${elog} ]; then
  echo "OK"
else
  echo "ERROR"
fi

否定

ちょっと演算子か明確にはわかりませんが。。。w

演算子 意味
! (演算子) 演算子の否定

ファイルチェック演算子の使用例でも使いましたが、!を使うことでその演算子を否定することができます。

ちなみに

シェルスクリプトの最初に記述するこの一行#!/bin/bashは、シバンシェバング(Shebang)などと呼びます。
「この行?フッ。。。この行はシェバングっていうんだZE☆」
とかってカッコつけてもいいかも。。。。