1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

bashのtestコマンドの整理

Last updated at Posted at 2020-12-23

概要

Bashで条件文を書く時に以下のように括弧を使うけど、きちんと仕組みを整理しておく。

if [ -f ${FILENAME} ];  then
  ...
fi

testコマンド

括弧は実はtestコマンドの省略形。以下の記述と上記は同じもの。
testコマンドは条件が真なら0、偽なら1を返すのでコマンドの戻り値をifで判定している。

if test -f ${FILENAME}; then
  ...
fi

ファイル系

説明
-e ファイル名 ファイルが存在するか
-f ファイル名 ファイルが通常のファイルか
-d ファイル名 ファイルがディレクトリか
-s ファイル名 ファイルサイズがゼロでないか
-x ファイル名 ファイルが実行可能か

条件系

説明
文字列1 = 文字列2 文字列1と文字列2が等しい場合
文字列1 != 文字列2 文字列1と文字列2が等しくない場合
-z 文字列1 文字列1のサイズがゼロの場合
-n 文字列1 文字列1のサイズがゼロでない場合。-nを省略しても同じ。
数値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以下の場合

条件式系

説明
条件式1 -a 条件式2 条件式1と条件式2のAND条件
条件式1 -o 条件式2 条件式1と条件式2のOR条件
if [ $A -eq 1 -a $B -eq 0 ]; then
  ...
fi

これと以下は同値。以下はそれぞれのtestコマンドを&&でつないで判定させている。

if [ $A -eq 1 ] && [ $B -eq 0 ]; then
  ...
fi

Bash拡張2重括弧

Bash拡張で2重括弧をつかうと、条件のグループ化や&&などを使うようにできる。

説明
(条件式) 条件式のグループ化
条件式1 && 条件式2 条件式1と条件式2のAND条件。-aは使えない。
条件式1
!条件式1 条件式1の否定条件。
文字列1 == 文字列2 文字列1と文字列2が等しい場合
文字列1 = 文字列2 ==と同じ
文字列1 != 文字列2 文字列1と文字列2が等しくない場合
文字列1 =~ 文字列パターン 拡張正規表現によるマッチ

Bash拡張の2重括弧を使うと以下のようにもかける

if [[ ( $A -eq 1 ) && ( $B -eq 0 ) ]]; then
  ...
fi

コマンドの存在チェックによる条件判定

testコマンドを使う場合は以下のような感じで判定できます。

which bash > /dev/null 2>&1
RES=$?
if [ $? -eq 0 ]; then
  echo "bash found"
else
  echo "bash not found"
fi

testコマンドを使わず直接witchコマンドの結果を見て判定することもできます。

if which bash > /dev/null 2>&1; then
  echo "bash found"
else
  echo "bash not found"
fi
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?