shellスクリプトでif文を書く!testコマンドとは?

testコマンドとは

testコマンドとは、ifなどと一緒に使用し条件式に対して真(true)もしくは偽(false)を評価します。例えばファイルやディレクトリの有無や権限などの属性を判別したり、変数や引数の値を評価します。

shellスクリプトlinuxコマンドで使用できるので、本記事ではshellスクリプトを使ってtestコマンドを説明します。

testコマンドでファイルの判定をするオプションの一覧

testコマンドのオプション 整数の判定。(数値比較演算子

下記は数値比較演算子の例になります。int型の整数値を比較する際に用いるtestコマンドのでは下記オプションが使用できます。

オプション 説明
intA -eq intB equal intA = intBの場合、真(true)を返す
intA -ne intB not equal intA != intBの場合、真(true)を返す
intA -gt intB greater than intA > intBの場合、真(true)を返す
intA -ge intB greater or equal intA >= intBの場合、真(true)を返す
intA -lt intB lesser than intA < intBの場合、真(true)を返す
intA -le intB lesser or equal intA <= intBの場合、真(true)を返す

ifを使った記述は下記のようになります。ここではshellスクリプトの引数の数である#$を評価します。

👉手順1. 引数を評価するshellスクリプトを作成する

実際にshellスクリプトを作成して、数値比較演算子の挙動を見てみましょう。任意のディレクトリにtest1.shを作成し、中身に下記を記述します。

#! /bin/bash

# 引数の数が2の場合
if [ $# -eq 1 ]; then
  echo "引数はの数は1です。"
fi

# 引数の数が1ではない場合
if [ $# -ne 1 ]; then
  echo "引数はの数は1ではありません。"
fi

# 引数の数が1以上の場合
if [ $# -gt 1 ]; then
  echo "引数はの数は1より大きいです。"
fi

# 引数の数が1以上の場合
if [ $# -ge 1 ]; then
  echo "引数はの数は1以上です。"
fi

# 引数の数が1より小さい場合
if [ $# -lt 1 ]; then
  echo "引数はの数は1より小さいです。"
fi

# 引数の数が1以下の場合
if [ $# -le 1 ]; then
  echo "引数はの数は1以下です。"
fi

ファイルの作成ができたら、shellを実行します。引数の数を判定するものなので、引数の数が「0、1、2」の3パターンで検証してみます。

$はコマンド部分を表したものです。実際には入力しないでください。$の無い部分は出力結果を表します。

$ bash test1.sh
引数はの数は1ではありません。
引数はの数は1より小さいです。
引数はの数は1以下です。

$ bash test1.sh arg1
引数はの数は1です。
引数はの数は1以上です。
引数はの数は1以下です。

$ bash test1.sh arg1 arg2
引数はの数は1ではありません。
引数はの数は1より大きいです。
引数はの数は1以上です。

else ifではなくifで羅列しているため、合致する条件全てを出力しています。1つ目のコマンドでは引数の数が0なので、「not equal 1」、「less then 1」、「less or equal 1」のパターンに合致するため、上記の出力になっています。

testコマンドのオプション 整数の判定。(数値比較演算子

下記はファイルを判定する際に使用できるtestコマンドのオプションの例になります。

オプション 説明
-d value 指定したvalueが存在し、かつディレクトリであれば真(true)を返す。
-e value 指定したvalueが存在すれば真(true)を返す。
-f value 指定したvalueが存在し、かつ通常のファイルであれば真(true)を返す。

👉手順2. ファイルを評価するshellスクリプトを作成する

ファイルを評価するshellスクリプトを作成して、挙動を見てみましょう。任意のディレクトリにtest2.shを作成し、中身に下記を記述します。

#! /bin/bash

if [ -d $1 ]; then
  echo "'$1'はディレクトリです"
else
  echo "'$1'はディレクトリではありません"
fi

👉手順3. スクリプトを作成した場所と同じディレクトリに下記(file.txt/directory)を作成します。

  • file.txt:任意のファイル
  • directory:任意のディレクトリ(フォルダ)
$ bash test2.sh directory
'directory'はディレクトリです
$ bash test2.sh file.txt 
'file.txt'はディレクトリではありません

今回の例では-dオプションで、ファイルとディレクトリの判定ができました。

終わりに

今回の手順1と2,3を合わせると引数にファイルやディレクトリを持たせるshellスクリプトにおいて、以降の処理を実行するかどうかの評価をすることができます。スクリプトを実行する際に実行条件を記述しておくことで無駄な処理を防ぐことができます。

それではよきtestコマンドライフを。