概要
一言で言うと条件を判定するコマンドです。
記法としては以下のように書くことができます。
test 条件
条件の部分には判定したい条件を書き
真の場合: 0
偽の場合: 1
を返します。
(※ 一般的なプログラミング言語の判定と逆になっていますが、これはUNIXプログラムが正常終了なら0、異常終了なら1を返す慣例を持っているため)
例として特定のファイル名のファイルが存在するかどうかは以下のようになります。
test -e exist.text; echo $status #=> 0
test -e not_exist.text; echo $status #=> 1
[]を用いた書式
上記の書き方とは別にtest文は以下のように書くことが出来ます。
[条件]
この記法を用いると先程の例は以下のようになります
[ -e exist.text ]; echo $status #=> 0
[ -e not_exist.text ]; echo $status #=> 1
このとき注意点として[]の中は必ず1スペース空ける必要があります。
ifとともに利用する
これまでの例ではecho $statusとして結果を出力していましたが、実際にはifと一緒に使われる事が多いです。
試しにこれでFizzBuzzを書いてみるとこのようになります。
for i in `seq 1 15`
do
if [ $(($i%3)) -eq 0 ] && [ $(($i%5)) -eq 0 ]; then
echo 'FizzBuzz'
elif [ $(($i%3)) -eq 0 ]; then
echo 'Fizz'
elif [ $(($i%5)) -eq 0 ]; then
echo 'Buzz'
else
echo $i
fi
done
様々な条件判定
testコマンドで使えるオプションは以下です。
ファイル処理
条件 | 判定 |
---|---|
-d file | fileがディレクトリであれば真 |
-e file | fileが存在すれば真 |
-f file | fileが通常ファイル(ディレクトリなどでない)なら真 |
-L file | fileがシンボリックリンクであれば真 |
-r file | fileが読み取り可能であれば真 |
-s file | fileのサイズが0でなければ真 |
-w file | fileが書き込み可能であれば真 |
-x file | fileが実行可能であれば真 |
文字列処理
条件 | 判定 |
---|---|
-z str | strの長さが0なら真 |
-n str | strの長さが0より大きければ真 |
str1 == str2 | 文字列が等しければ真 |
str1 != str2 | 文字列が等しくなければ真 |
数値処理
条件 | 判定 |
---|---|
int1 -eq int2 | int1とint2が等しければ真 |
int1 -ne int2 | int1とint2が等しくなければ真 |
int1 -lt int2 | int1がint2より小さければb真 |
int1 -le int2 | int1がint2が等しいか小さければ真 |
int1 -gt int2 | int1がint2より大きければ真 |
int1 -ge int2 | int1がint2より等しいか大きければ真 |
論理条件
条件 | 判定 |
---|---|
! 条件 | 条件が偽であれば真 |
条件1 -a 条件2 | 条件1と条件2がともに真であれば真 |
条件1 -o 条件2 | 条件1か条件2のどちらかが真であれば真 |
&& と ||を用いた条件判定
command1 && command2 # command1が正しく実行されたとき、command2を実行
command1 || command2 # command1でエラーが起きたとき、command2を実行
の記法を用いてif文をより簡潔に書ける場合があります
例えば
if cat $1; then
echo OK
fi
↓
cat $1 && echo OK
if ! [ $((1%3)) -eq 0 ]; then
echo NG
fi
↓
[ $((1%3)) -eq 0 ] || echo NG
のように書くことが出来ます。
今まで何気なく
if [hogehoge]
と書いてきましたが知らないうちにtestコマンドを使っていたんですね。
複雑なshellを書くときに無くてはならない便利なコマンドです。