このエントリーをはてなブックマークに追加

shellスクリプトでは制御構文としてwhileやifなどが利用可能です。whileやifでは条件式の評価結果(true/false)によって分岐をおこないます。 これらの条件判定ではtest(簡易表現の[ ])で評価をおこないます。

例えば

if test 変数 = 0 ; then
    実行文
fi

この「test 変数 = 0」の部分が条件式になります。

またtestの部分は、以下のように[ ]を用いた簡易表現でも記述可能です。

if [ 変数 = 0 ] ; then
    実行文
fi

以下では、このtestの使い方について解説します。

数値評価(比較)

testを用いて数値の比較には、-eq(equal)、-ne(not equal)、-lt(less than)、-le(less than or equal)、-gt(greater than)、-ge(greater than or equal)が利用可能です。

$ test 1 -eq 1 # true
$ echo $?
0
$ test 1 -eq 2 # false
$ echo $?
1
$ test 1 -ne 2 # true
$ echo $?
0
$ test 1 -ne 1 # false
$ echo $?
1
$
$ test 1 -lt 1 # false
$ echo $?
1
$ test 1 -lt 2 # true
$ echo $?
0
$ test 2 -lt 1 # false
$ echo $?
1
$ test 1 -le 1 # true
$ echo $?
0
$ test 1 -le 2 # true
$ echo $?
0
$ test 2 -le 1 # false
$ echo $?
1
$
$ test 1 -gt 1 # false
$ echo $?
1
$ test 1 -gt 2 # false
$ echo $?
1
$ test 2 -gt 1 # true
$ echo $?
0
$ test 1 -ge 1 # true
$ echo $?
0
$ test 1 -ge 2 # false
$ echo $?
1
$ test 2 -ge 1 # true
$ echo $?
0

文字列比較

文字列は=または!=で比較が可能です。

$ test 'aaa' = 'aaa' # true
$ echo $?
0
$ test 'aaa' = 'bbb' # false
$ echo $?
1
$ test 'aaa' != 'aaa' # false
$ echo $?
1
$ test 'aaa' != 'bbb' # true
$ echo $?
0

ファイルの評価

使用するファイルを準備します。

$ mkdir test_dir
$ touch test_file
$
$ touch test_file_size_zero
$ echo "size not zero" > test_file_size_not_zero
$
$ touch test_file_read_only
$ chmod 444 test_file_read_only
$
$ touch test_file_write_only
$ chmod 222 test_file_write_only
$
$ touch test_file_execute_only
$ chmod 111 test_file_execute_only
$ ls -la
合計 16
drwxrwxr-x   3 test test 4096 12月 25 18:02 2013 .
drwx------. 15 test test 4096 12月 13 14:51 2013 ..
drwxrwxr-x   2 test test 4096 12月 25 18:02 2013 test_dir
-rw-rw-r--   1 test test    0 12月 25 18:02 2013 test_file
---x--x--x   1 test test    0 12月 25 18:02 2013 test_file_execute_only
-r--r--r--   1 test test    0 12月 25 18:02 2013 test_file_read_only
-rw-rw-r--   1 test test   14 12月 25 18:02 2013 test_file_size_not_zero
-rw-rw-r--   1 test test    0 12月 25 18:02 2013 test_file_size_zero
--w--w--w-   1 test test    0 12月 25 18:02 2013 test_file_write_only

ディレクトリ評価の例

$ test -d test_dir # true
$ echo $?
0
$ test -d test_file # false
$ echo $?
1

ファイル評価の例(-f)

$ test -f test_file # true
$ echo $?
0
$ test -f test_dir # false
$ echo $?
1

ファイルの有無の評価(-e)

$ test -e test_dir # true
$ echo $?
0
$ test -e test_file # true
$ echo $?
0
$ test -e no_such_file_name # false
$ echo $?
1

ファイルのサイズ評価の例(-s)

$ test -s test_file_size_not_zero # true
$ echo $?
0
$ test -s test_file_size_zero # false
$ echo $?
1

ファイルの読み取り属性評価の例(-r)

$ test -r test_file_read_only # true
$ echo $?
0
$ test -r test_file_write_only # false
$ echo $?
1
$ test -r test_file_execute_only # false
$ echo $?
1

ファイルの書き込み属性評価の例(-w)

$ test -w test_file_write_only # true
$ echo $?
0
$ test -w test_file_read_only # false
$ echo $?
1
$ test -w test_file_execute_only # false
$ echo $?
1

ファイルの実行属性評価の例(-x)

$ test -x test_file_execute_only # true
$ echo $?
0
$ test -x test_file_write_only # false
$ echo $?
1
$ test -x test_file_read_only # false
$ echo $?
1

文字列長評価の例(-z/-n)

$ test -z '' # true
$ echo $?
0
$ test -z 'not zero length' # false
$ echo $?
1
$
$ test -n 'not zero length' # true
$ echo $?
0
$ test -n '' # false
$ echo $?
1

ファイル比較

新旧ファイルの比較をおこなうには-nt(newer than)または-ot(older than)を使用する。

新旧ファイルを準備します。

$ touch test_file_older
$ sleep 2
$ touch test_file_newer

準備したファイルを使用して-nt/-otで比較してみます。

$ test test_file_newer -nt test_file_older # true
$ echo $?
0
$ test test_file_older -nt test_file_newer # false
$ echo $?
1
$ test test_file_older -ot test_file_newer # true
$ echo $?
0
$ test test_file_newer -ot test_file_older # false
$ echo $?
1

ちなみに-oe(older than or equal)と-ne(newer than or equal)というのはありません。




記事一覧へ