Help us understand the problem. What is going on with this article?

シェルスクリプト(bash)のif文とtestコマンド([])自分メモ

More than 3 years have passed since last update.

シェルスクリプト(bash)のif文を書く時、あれなんだっけと忘れることがよくあるので簡単にまとめてみました。

参考

大切なことはこちらに書いてあります

if 文と test コマンド

前提知識

  • if文では条件式に指定されたコマンドの終了ステータスを判定し分岐をしている。終了ステータスが0の場合に真となり、そうでない場合には偽となる
  • if []と書いた場合、if testと書いたことと同じ扱い([]はtestコマンドの略式)
  • [ "A" = "A" ]というように[]の間にスペースがないとエラーとなる。例えば["A" = "A"]とか書くとエラー。[がコマンドだと思うと理解しやすい
  • 条件式で<,>,<=,>=は使えない。代わりに-lt(<),-gt(>),-le(<=),-ge(>=)というのが使える。それぞれ-lt(less than),-gt(greater than),-le(less than or equal),-ge(greater than or equal)と覚える。でもわかりにくいので全部書いておきました。
  • 困ったらman testで確認すればOK

コマンド集

文字列が等しいか

#!/bin/bash

hoge="A"
fuga="A"

if [ $hoge = $fuga ]; then
  echo "文字列は同じです"
else
  echo "文字列は違います"
fi

>を条件式に使いたい

-gt(greater than)を使う

#!/bin/bash

var1=1
var2=2

# >
if [ $var2 -gt $var1 ] ; then
  echo "var2はvar1より大きい"
else
  echo "var2はvar1以下"
fi

<を条件式に使いたい

-lt(less than)を使う

#!/bin/bash

var1=1
var2=2

# <
if [ $var1 -lt $var2 ] ; then
  echo "var1はvar2より小さい"
else
  echo "var1はvar2以上"
fi

>=を条件式に使いたい

-ge(greater than or equal)を使う

#!/bin/bash

var1=2
var2=2

# >=
if [ $var2 -ge $var1 ] ; then
  echo "var2はvar1以上"
else
  echo "var2はvar1より小さい"
fi

<=を条件式に使いたい

-le(less than equal)を使う

#!/bin/bash

var1=2
var2=2

# <=
if [ $var1 -le $var2 ] ; then
  echo "var1はvar2以下"
else
  echo "var1はvar2より大きい"
fi

ディレクトリの存在確認をしたい

-dオプションを使う。

#!/bin/bash

DIR="test"

if [ -d ${DIR} ]; then
  echo "ディレクトリが存在します"
else
  echo "ディレクトリが存在しません"
fi

ファイルの存在確認をしたい

-fオプションを使う

#!/bin/bash

LOCK_FILE="lock"

if [ -f ${LOCK_FILE} ]; then
  echo "ファイルが存在します"
else
  echo "ファイルが存在しません"
fi

シェルスクリプト内で実行したコマンドが正常終了したかを判定

コマンド実行後、$?によって直前のコマンドの終了ステータスコードが取得できるので0(正常終了であるか)判定する

#!/bin/bash

curl http://www.google.co.jp >/dev/null 2>&1

if [ $? = 0 ]; then
  echo "curlは正常終了"
else
  echo "curlは異常終了"
fi

$?は直前のコマンドの終了ステータスコードのみ保持しているので判定したいコマンドとif文の間で別のコマンドの実行をする場合には一度変数に$?の内容を保持しておく

NOT条件を使う

!オプションを使う。

#!/bin/bash

hoge=true

if [ ! $hoge ]; then
  echo "こっちにはこない"
else
  echo "こっちになる"
fi

AND条件、OR条件を使う

testコマンドの-a(AND条件)、-o(OR条件)で書けるが、&&(AND条件)、||(OR条件)の方が個人的には分かりやすい。
ただし、-a、-oは1つのtestコマンドで条件判定するのに対し、&&、||は終了ステータスコードを判断して以降の処理を実行するものなので書き方が少し違う点に注意。

-a、-oを利用する場合

#!/bin/bash

LOCK_FILE="lock"
DIR="dir"

if [ -f ${LOCK_FILE} -a -d ${DIR} ]; then
  echo "ファイルとディレクトリが存在します"
else
  echo "ファイルかディレクトリのいずれかが存在しません"
fi

&&、||を利用する場合

#!/bin/bash

LOCK_FILE="lock"
DIR="dir"

if [ -f ${LOCK_FILE} ] && [ -d ${DIR} ]; then
  echo "ファイルとディレクトリが存在します"
else
  echo "ファイルかディレクトリのいずれかが存在しません"
fi
toshihirock
こちらは個人の意見で会社とは関係ありません。お約束です。
http://toshihirock.blogspot.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした