本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、条件式を評価することでファイルの有無などを判定する「test」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は条件式を評価することでファイルの有無などを判定する「test」コマンドです。
「test」は、条件式を評価して真偽の値を返すコマンドです。ファイルの有無や種類などを判定したり、文字列や数を比較したりでき、主にシェルスクリプト内で使用します(※1)。
以下では連載第221回に引き続き、コマンドラインでtestコマンドを使用する方法を紹介します。シェルスクリプトを書くに当たり、判定結果を確かめておきたい場合などに役立ちます。
testコマンドはbashの内部コマンドです。同名のコマンド(/bin/test)も存在します。
※1 シェルスクリプトではtestと同じ働きをする「[ ]」コマンドを使って書くことが一般的だ。while文での使用例は、連載第219回を参照。
test [オプション] 対象
test 条件式
※「条件式」は、「文字列1 = 文字列2」のような記号による比較や、オプションと対象を組み合わせた書き方がある。[ ]は省略可能な引数。
式 | 真になる条件 |
---|---|
-e ファイル名 | ファイルが存在するとき |
-f ファイル名 | ファイルが通常のファイルのとき |
-d ファイル名 | ディレクトリのとき |
-s ファイル名 | ファイルの長さが0ではない(ファイルが空ではない)とき |
-L ファイル名 | ファイルがシンボリックリンクのとき |
-h ファイル名 | ファイルがシンボリックリンクのとき(「-L」と同じ) |
ファイル1 -ef ファイル2 | ファイル1がファイル2のハードリンクのとき |
式 | 真になる条件 |
---|---|
-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)と等しいことが多い。
式 | 真になる条件 |
---|---|
-t 0 | 標準入力が端末 |
-t 1 | 標準出力が端末 |
-t 2 | 標準エラー出力が端末 |
-t 数値 | 数値番目のファイルディスクリプターが端末 |
式 | 真になる条件 |
---|---|
文字列1 = 文字列2 | 文字列1と文字列2が等しいとき |
文字列1 != 文字列2 | 文字列1と文字列2が等しくないとき |
-z 文字列1 | 文字列1の長さが0のとき |
-n 文字列1 | 文字列1の長さが0ではないとき |
式 | 真になる条件 |
---|---|
数値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) |
式 | 真になる条件 |
---|---|
-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コマンドを使って文字列の一致を判定するには「文字列1 = 文字列2」という条件式を使います。それぞれをtestコマンドの引数として扱うため、「=」の前後の空白を省略してはいけません。
画面1では、環境変数LANGの値を使って文字列の一致、不一致を見ています。部分的な一致を調べるに当たって、「LANG%」や「LANG#」というようにbashのパラメーター展開(第216回)を使用しています。
test 文字列1 = 文字列2
(文字列1と文字列2が一致する)
test 文字列1 != 文字列2
(文字列1と文字列2が一致しない)
なお、bashの複合コマンド「[[」を使用すると、「=~」でパターンマッチによる一致を判定できます。例えば、環境変数LANGに「JP」という文字列が含まれているかどうかであれば「[[ $LANG =~ .*JP.* ]]」のようにします(画面2、※5)。
※5 「[[」は必ず「]]」と組み合わせて使う。「[[」はコマンドであるため、後ろに空白が必要だ。「]]」は前に空白を入れる。
変数の内容が空かどうかはtestコマンドに「-z」や「-n」を付けて判定します(画面3)。「-z」は空のとき(内容の長さが0のとき)真になり、「-n」は空ではないときに真になります。
ただし、変数が定義されていないと、「-n」や「-z」は正常に動作しません。指定した変数が定義されているかどうかは「-v」を使って確認します(※6)。「test -v LANG」のように変数名を指定し、変数が存在すれば真になります。
※6 「test -v」はbash 4.2以降で追加されたため、CentOS 6.9の4.1,2(2)では非対応だ。CentOS 7の4.2.46(1)やUbuntu 14.04LTSでは対応している。Bash changesを参照。
test -z 文字列
(変数が空のとき真)
test -n 文字列
(変数が空ではないとき真)
test -v 変数名
(変数が定義されているとき真)
西村 めぐみ(にしむら めぐみ)
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.