連載
» 2018年07月06日 05時00分 公開

Linux基本コマンドTips(221):【 test 】コマンド(基礎編)――ファイルの有無などを判定する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、条件式を評価することでファイルの有無などを判定する「test」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は条件式を評価することでファイルの有無などを判定する「test」コマンドです。

testコマンドとは?

 「test」は、条件式を評価して真偽の値を返すコマンドです。ファイルの有無や種類などを判定したり、文字列や数を比較したりでき、主にシェルスクリプト内で使用します(※1)。

 以下では、コマンドラインでtestコマンドを使用する方法を紹介します。シェルスクリプトを書くに当たり、判定結果を確かめておきたい場合などに役立ちます。

 testコマンドはbashの内部コマンドです。同名のコマンド(/bin/test)も存在します。

※1 シェルスクリプトではtestと同じ働きをする「[ ]」コマンドを使って書くことが一般的だ。while文での使用例は、連載第219回を参照。





testコマンドの書式

test [オプション] 対象

test 条件式

※「条件式」は、「文字列1 = 文字列2」のような記号による比較や、オプションと対象を組み合わせた書き方がある。[ ]は省略可能な引数。





testの主なオプションと式(ファイルの判定)

真になる条件
-e ファイル名 ファイルが存在するとき
-f ファイル名 ファイルが通常のファイルのとき
-d ファイル名 ディレクトリのとき
-s ファイル名 ファイルの長さが0ではない(ファイルが空ではない)とき
-L ファイル名 ファイルがシンボリックリンクのとき
-h ファイル名 ファイルがシンボリックリンクのとき(「-L」と同じ)
ファイル1 -ef ファイル2 ファイル1がファイル2のハードリンクのとき

testの主なオプションと式(ファイル属性の判定)

真になる条件
-r ファイル名 ファイルが存在し、読み出しの権限がユーザーにあるとき
-w ファイル名 ファイルが存在し、書き込み権限がユーザーにあるとき
-x ファイル名 ファイルが存在し、ファイルの実行権限がユーザーにあるとき
-O ファイル名 ファイルの実体の所有者が実効ユーザーIDと同じとき(※2)
-G ファイル名 ファイルの実体の所属グループが実効グループIDと同じとき
-u ファイル名 ファイルの実体にsetuidビットが立っているとき
-g ファイル名 ファイルの実体にsetgidビットが立っているとき
-k ファイル名 ファイルの実体にstickyビットが立っているとき
ファイル1 -nt ファイル2 ファイル1の修正時刻がファイル2の修正時刻より新しいとき
ファイル1 -ot ファイル2 ファイル1の修正時刻がファイル2の修正時刻より古いとき

※2 実効ユーザーID(euid)とはプログラムが動作するときの権限。プログラムを起動したユーザーのID(実ユーザーID、ruid)と等しいことが多い。



testの主なオプションと式(標準入出力の判定)

真になる条件
-t 0 標準入力が端末
-t 1 標準出力が端末
-t 2 標準エラー出力が端末
-t 数値 数値番目のファイルディスクリプターが端末

testの主なオプションと式(文字列の判定)

真になる条件
文字列1 = 文字列2 文字列1と文字列2が等しいとき
文字列1 != 文字列2 文字列1と文字列2が等しくないとき
-z 文字列1 文字列1の長さが0のとき
-n 文字列1 文字列1の長さが0ではないとき

testの主なオプションと式(整数の判定)

真になる条件
数値1 -eq 数値2 数値1と数値2が等しいとき(equal)
数値1 -ne 数値2 数値1と数値2が等しくないとき(not equal)
数値1 -gt 数値2 数値1が数値2より大きいとき(greater than)
数値1 -ge 数値2 数値1が数値2より大きいか等しいとき(greater or equal)
数値1 -lt 数値2 数値1が数値2より小さいとき(lesser than)
数値1 -le 数値2 数値1が数値2より小さいか等しいとき(lesser or equal)

testの主なオプションと式(その他)

真になる条件
-o オプション シェルオプションが定義されていた(※3)
-v 変数名 変数が定義されていた(※3)
! 条件式 条件式が偽のとき(not)
条件式1 -a 条件式2 条件式1と条件式2がどちらも真のとき(and)
条件式1 -o 条件式2 条件式1と条件式2のどちらかが真のとき(or)
( 条件式 ) ()の中を優先して評価する(※4)
TRUE 常に真
FALSE 常に偽

※3 -oと-vは/bin/testでは使用できない(-vはbashバージョン4.2以降)。シェルオプションについてはsetコマンド(第205回)を参照。
※4 「(」「)」を使用する際はバックスラッシュなどでエスケープする必要がある。





ファイルやディレクトリの有無を判定する

 testコマンドを使ってファイルの有無を判定するには、「test -f ファイル名」とします。「-f」は、「ファイルが存在し、かつ、通常ファイルである場合」に真となります。

 「通常ファイル」には、ディレクトリや特殊ファイルが含まれません。「ls -l」の先頭文字が「-」で表示されるものが通常ファイルに該当します。シンボリックリンクを指定した場合は、リンク先が通常ファイルかどうかで判定します(次項参照)。

 ディレクトリかどうかは「-d」、種類を問わずとにかく存在するかどうかは「-e」で判定できます。

 画面1では、testコマンドを実行した直後に、直前に実行したコマンドの終了コードを「echo $?」で表示しています。testコマンドの判定結果が真かどうかは、testコマンドの実行が成功、つまり終了コードが0かどうかで判断します。

 testコマンドとechoコマンドを1行のコマンドラインに書くために、画面1では「;」記号で区切っています。

コマンド実行例

test -f ファイル名

(ファイルが存在し、かつ、通常ファイルであるときに真)

test -d ファイル名

(ファイルが存在し、かつ、ディレクトリであるときに真)

test -e ファイル名

(ファイルが存在するときに真)


画面1 画面 さまざまな条件でファイルを判定したところ touchコマンドについては第23回を参照


シンボリックリンクを判定する

 testコマンドでシンボリックリンクを対象とした場合は、リンク先によって判定結果が異なります。シンボリックリンクかどうかを判断したい場合は「-L」または「-h」を使用します。

 画面2は画面1の続きで、testfileという通常ファイルとtestdirというディレクトリがある環境で実行しています。

コマンド実行例

test -L ファイル名

(ファイルが存在し、かつ、シンボリックリンクであるとき真)


画面2 画面2 シンボリックリンクを対象に判定したところ lnコマンドについては第16回を参照


2つの判定を組み合わせる

 testコマンドを使って2つの条件式を組み合わせて判定したい場合は、「-a」(ANDの関係)または「-o」(ORの関係)を使用します。

 例えば、「通常ファイルであり、かつ、シンボリックリンク」であれば「test -f ファイル名 -a -L ファイル名」のように書きます。

 「シンボリックリンクではない」のように、判定結果を否定したい場合は「!」を添えます。「!」は2つの条件式を組み合わせたときに限り、利用できます。

 例えば、「通常ファイルであり、かつ、シンボリックリンクではない」という場合は「test -f ファイル名 -a ! -L ファイル名」とします。

 画面3は画面2の続きで、「testfile」(通常ファイル)へのシンボリックリンク「link1」と、「testdir」(ディレクトリ)へのシンボリックリンク「link2」がある環境で実行しています。

コマンド実行例

test -f ファイル名 -a -L ファイル名

(ファイルがシンボリックリンクで、リンク先が通常ファイルのときに真)

test -f ファイル名 -a ! -L ファイル名

(ファイルは通常ファイルでシンボリックリンクではない)


画面3 画面3 2つの条件式を組み合わせて判定したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。