testコマンドは、[]コマンドという別の形を持つコマンドです。
条件分岐として使用することができるため、シェルスクリプトを作成するときなどでとても便利なコマンドです。
使用用途は幅広く、ぜひ覚えておきたいLinuxコマンドです。
目次
testコマンドとは
testコマンドは、引数の条件式を評価し、0(真)か1(偽)を結果として返します。
testコマンドは、ファイルのチェック、文字列の比較、数値の比較等を行うことができま
testコマンドは、別の形式を扱うことができます。以下の表現は同じ意味になります。
コマンド例1
1 |
test <expression> |
コマンド例2
1 |
[ <expression> ] |
[]コマンドを用いるときは、[の後にスペースを空け、]の前にもスペースを空けることに注意が必要になります。
また、testコマンドの<expression>が省略された場合は1(偽)になります。
<expression>が単一の引数の場合はnullならば1(偽)に、それ以外なら0(真)になります。
また、変数を用いる場合は、クオートで囲むほうがいいでしょう(例:"$var")。
testコマンドの利用例
ファイルタイプのチェック
testコマンドは、ファイルの存在を確認し、そのファイルタイプによって判定を行うことができます。
ファイルタイプのチェックに使う表現をまとめておきます。
ファイルタイプのチェックまとめ表
表現 | 意味 |
-b file | block special deviceならばtrue |
-c file | character special deviceならばtrue |
-d file | directoryならばtrue |
-f file | regular file(通常ファイル)ならばtrue |
-h file または -L file |
symbolic linkならばtrue |
-p file | named pipe(名前付きパイプ)ならばtrue |
-S file | socketならばtrue |
-t fd | file descriptor(ファイルディスクリプタ)として 端末に関連付けされているならばtrue |
次に、ファイルタイプのチェックに関していくつかのコマンド例を示します。
通常ファイルの存在を判定
(-f file)
-fオプションは通常ファイルが存在するかどうかの判定を行う事ができます。
ここでは、[]コマンドを用いて、if文を作成しています。
[]コマンドの処理は、file1という通常ファイルが存在するならば0(真)、それ以外なら1(偽)になります。
このコマンドの処理は、[]コマンドが真ならば「true」という文字を表示し、偽ならば何も表示しません。
コマンド例
1 |
if [ -f file1 ]; then echo true; fi |
ls -lの確認
1 2 3 |
合計 4 drwxrwxr-x 2 ubuntu ubuntu 4096 9月 4 03:48 dir1 -rw-rw-r-- 1 ubuntu ubuntu 0 9月 4 18:51 file1 |
実行結果
1 |
true |
ディレクトリの存在を判定
(-d file)
-dオプションはディレクトリが存在するかどうかの判定を行う事ができます。
ここでも、[]コマンドを用いて、if文を作成しています。
[]コマンドの処理は、dir1というディレクトリが存在するならば0(真)、それ以外なら1(偽)になります。
このコマンドの処理は、[]コマンドが真ならば「true」という文字を表示し、偽ならば何も表示しません。
コマンド例
1 |
if [ -d dir1 ]; then echo true; fi |
ls -lの確認
1 2 3 |
合計 4 drwxrwxr-x 2 ubuntu ubuntu 4096 9月 4 03:48 dir1 -rw-rw-r-- 1 ubuntu ubuntu 0 9月 4 18:51 file1 |
実行結果
1 |
true |
ファイルディスクリプタの存在を判定
(-t fd)
ファイルディスクリプタ(ファイル記述子)とは、OSが、プログラムが参照するファイルを識別するために用いるもので、0から始まる非負整数になります。
また、0は標準入力、1は標準出力、2は標準エラー出力にOSで自動的に割り当てられています。
-tオプションは、ファイルディスクリプタが存在を判定することができます。
コマンド例
1 |
if [ -t 1 ]; then echo true; fi |
実行結果
1 |
true |
文字列のチェック
testコマンドは、文字列同士の比較を行うことができます。
文字列のチェックに使う表現をまとめておきます。
文字列のチェックまとめ表
表現 | 意味 |
-z string | 文字列の長さが0ならばtrue |
-n string string |
文字列の長さが0ではないならばtrue |
string1 = string2 string1 == string2 |
文字列が等しいならばtrue |
string1 != string2 | 文字列が等しくないならばture |
次に、文字列のチェックに関していくつかのコマンド例を示します。
同じ文字列の判定
同じ文字列かどうかを判定する場合は、=または==を用います。
=または==の両端にスペースを入れる必要であるということに注意が必要です。
コマンド例
1 |
if [ "a" = "a" ]; then echo true; fi |
実行結果
1 |
true |
コマンド例
1 |
if [ "a"="b" ]; then echo true; fi |
実行結果
1 |
true |
違う文字列の判定
違う文字列かどうかを判定する場合は、!=を用います。
!=の両端にスペースが必要なことに注意が必要です。
コマンド例
1 |
if [ "a" != "b" ]; then echo true; fi |
実行結果
1 |
true |
数値のチェック
testコマンドは、数値の比較を行うことができます。
数値のチェックに使う表現をまとめておきます。
数値のチェックまとめ表
表現 | 解釈 | 意味 |
num1 -eq num2 | num1 = num2 | 等しいならばtrue |
num1 -ne num2 | num1 != num2 | 等しくないならばtrue |
num1 -lt num2 | num1 < num2 | num1がnum2より小さいならばtrue |
num1 -le num2 | num1 <= num2 | num1がnum2以下ならばtrue |
num1 -gt num2 | num1 > num2 | num1がnum2より大きいならばtrue |
num1 -ge num2 | num1 >= num2 | num1がnum2以上ならばtrue |
次に、数値のチェックに関していくつかのコマンド例を示します。
数値が等しいかを判定
数値が等しいかどうかを判定する場合は-eqを用います。
コマンド例
1 |
if [ 123 -eq 123 ]; then echo true; fi |
実行結果
1 |
true |
数値が等しくないかを判定
数値が等しくないかどうかを判定する場合は-neを用います。
コマンド例
1 |
if [ 123 -ne 234 ]; then echo true; fi |
実行結果
1 |
true |
ファイル特性のチェック
testコマンドは、ファイル特性をチェックし判定を行うことができます。
ファイルが存在しない場合は常に1(偽)になります。
このファイル特性のチェックに使う表現をまとめておきます。
ファイル特性のチェックまとめ表
表現 | 意味 |
-e file | fileが存在するならばtrue |
-s file | fileのサイズが0より大きいならばtrue |
file1 -nt file2 | file1がfile2よりmtimeが新しいならばtrue |
file1 -ot file2 | file1がfile2よりmtimeが古いならばtrue |
file1 -ef file2 | file1とfile2が同じデバイスで同じinode番号ならばtrue |
次に、ファイル特性のチェックに関していくつかのコマンド例を示します。
ファイルが存在するかどうかを判定
ファイルが存在するかは-eを用います。ファイルが存在する場合は0(真)になります。
コマンド例
1 |
if [ -e aaa ]; then echo true; fi |
カレントディレクトリでのファイルの存在を確認(lsコマンド)
1 |
aaa bbb dir1 file1 |
実行結果
1 |
true |
ファイルの修正時間(mtime)が新しいかどうか判定
ファイルを比較する場合、mtimeが新しいかどうかを判定する場合は-ntを用います。
コマンド例
1 |
if [ bbb -nt aaa ]; then echo true; fi |
mtimeの確認(ls --full-time)
1 2 3 4 5 |
合計 4 -rw-rw-r-- 1 ubuntu ubuntu 0 2017-09-10 11:17:14.713422320 +0900 aaa -rw-rw-r-- 1 ubuntu ubuntu 0 2017-09-13 17:25:33.760171565 +0900 bbb drwxrwxr-x 2 ubuntu ubuntu 4096 2017-09-04 03:48:10.614272380 +0900 dir1 -rw-rw-r-- 1 ubuntu ubuntu 0 2017-09-04 18:51:02.296740966 +0900 file1 |
実行結果
1 |
true |
ハードリンクかどうかを判定
file1とfile2が同じデバイスで同じinode番号というのは、file1とfile2がハードリンクかどうかを判定するという意味になります。
ハードリンクかどうかを判定する場合は、-efを用います。
コマンド例
1 |
if [ file1 -ef file1_hardlink ]; then echo true; fi |
inode番号の確認(ls -1 --inode)
1 2 3 4 5 |
12848267 aaa 12847691 bbb 12848016 dir1 12847588 file1 12847588 file1_hardlink |
実行結果
1 |
true |
パーミッションのチェック
testコマンドは、パーミッションのチェックを行うことができます。
パーミッションのチェックに使う表現をまとめておきます。
パーミッションのチェックまとめ表
表現 | 意味 |
-g file | set-group-ID bitがあるならばtrue |
-k file | sticky bitがあるならばtrue |
-r file | r bitがあるならばtrue |
-u file | set-user-ID bitがあるならばtrue |
-w file | w bitがあるならばtrue |
-x file | x bitがあるならばtrue |
-O file | 所有者が現在有効なユーザIDならばtrue |
-G file | 所有者が現在有効なグループIDならばtrue |
次に、パーミッションのチェックに関していくつかのコマンド例を示します。
書き込み可能かどうかの判定
-wはユーザが書き込み可能かどうかの判定を行います。
コマンド例
1 |
if [ -w file1 ]; then echo true; fi |
パーミッションの確認(ls -l)
1 |
-rwx------ 1 ubuntu ubuntu 0 9月 4 18:51 file1 |
実行結果
1 |
true |
sticky bitの判定
sticky bitとは制限付き削除フラグのことで、このパーミッション付与されたファイルまたはディレクトリは、所有者(rootを除く)しか削除できません。
-kはファイルでの権限にsticky bitがあるかどうか判定を行います。
コマンド例
1 |
if [ -k file1 ]; then echo true; fi |
パーミッションの確認(ls -l)
1 |
-rwxrwxrwt 1 ubuntu ubuntu 0 9月 4 18:51 file1 |
権限の一番右に「t」という文字があり、これがsticky bitになります。
実行結果
1 |
true |
コマンド例
1 |
chmod +t file1 |
ANDとORとNOT
testコマンドは、ファイルの存在を確認し、そのファイルタイプによって判定を行うことができます。
ただし、testコマンドの表現よりシェルの論理表現(&&,||)のほうが好まれます。
このファイルタイプのチェックに使う表現をまとめておきます。
ファイルタイプのチェックまとめ表
表現 | 解釈 |
! expr | NOT expr |
expr1 -a expr2 | expr1 AND expr2 |
expr1 -o expr2 | expr1 OR expr2 |
ただし、-aは-oより優先順位が高い
次に、論理表現に関していくつかのコマンド例を示します。
AND
-aでANDの論理表現ができますが変数によっては意図した動作にならない場合があるため、シェルの組み込みコマンド「&&」を用いるほうが好まれます。
コマンド例
1 |
if [ 1 -eq 1 -a "aaa" = "aaa" ] ; then echo true; fi |
または
1 |
if [ 1 -eq 1 ] && [ "aaa" = "aaa" ] ; then echo true; fi |
実行結果
1 |
true |
NOT
「!」の前後にスペースが必要なことに注意が必要です。また、シェルの組み込みコマンドにも同じ「!」のコマンドがあります。意味はtrueとfalseの反転で同じです。
コマンド例
1 |
if [ ! 1 -eq 2 -a "aaa" = "aaa" ] ; then echo true; fi |
または
1 |
if ! [ 1 -eq 2 ] && [ "aaa" = "aaa" ] ; then echo true; fi |
実行結果
1 |
true |
複雑な論理表現
シェルの括弧(「(」と「)」)を用いれば、優先順位を変更することができます。
コマンド例
1 |
if ! [ 1 -eq 2 ] && ! ( [ "aaa" = "bbb" ] && [ "aaa" = "aaa" ] ) ; then echo true; fi |
実行結果
1 |
true |
その他の表現
testコマンドは、ファイルの存在を確認し、そのファイルタイプによって判定を行うことができます。このファイルタイプのチェックに使うオプションをまとめておきます。
ファイルタイプのチェックまとめ表
表現 | 意味 |
-o optname | 組み込みコマンドのsetでoptnameがONならばtrue |
-v varname | シェルの変数varnameに値が割り当てられているならばtrue |
-R varname | シェルの変数varnameが名前参照ならばtrue |
次に、その他のチェックに関していくつかのコマンド例を示します。
setコマンドのオプション判定
-oでsetコマンドのオプションがONになっているかどうかを判定することができます。
コマンド例はあらかじめにset -xを入れています。
コマンド例
1 |
if [ -o xtrace ] ; then echo true; fi |
実行結果
1 |
true |
シェル変数の値割り当ての判定
-vでシェルの変数に値が割り当てられているかを確認することができます。
ここでは、aという変数にあらかじめ値を割り当てています。
コマンド例
1 |
if [ -v a ] ; then echo true; fi |
実行結果
1 |
true |
変数が名前参照かを判定
名前参照は、ある変数に別の変数名を入れ、そのある変数を呼び出すことで別の変数名の値を呼び出すことができます。
-Rでその変数が名前参照かどうかを判定することができます。
コマンド例
1 |
if [ -R b ] ; then echo true; fi |
宣言の確認(declare -p a b : 引数は変数名a,b)
1 2 |
declare -- a="aaa" declare -n b="a" |
実行結果
1 |
true |
コマンド例
1 |
declare -n b=a |
名前参照の宣言を解除するには以下のコマンドになります。
コマンド例
1 |
unset -n b |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版
外部リンクGNU Bash manual