自身の備忘を兼ねて記載を行っています。
「とりあえず動いた」程度のソースなどもございますので参考程度にブラシアップ頂けると幸いです。
また、誤りやもっとよいコーディングやきれいな書き方があるなどご指摘頂けるととてもうれしいです。
今回のお題
良く忘れるtestコマンドの演算子を思い出しがてらにとりまとめ
演算子一覧表
数値の比較
意味 | 不等号 | testコマンド | if文で使う例 |
---|---|---|---|
n以上 | n >= y | test n -ge y | if [ n -ge y ]; then |
n以下 | n <= y | test n -le y | if [ n -le y ]; then |
nより大きい | n > y | test n -gt y | if [ n -gt y ]; then |
nより小さい | n < y | test n -lt y | if [ n -lt y ]; then |
nと同じ | n = y | test n -eq y | if [ n -eq y ]; then |
nと異なる | n <> y (n != y) | test n -ne y | if [ n -ne y ]; then |
文字列の比較
意味 | 不等号 | testコマンド | if文で使う例 |
---|---|---|---|
nと同じ | n = y | test "n" = "y" | if [ "n" = "y" ]; then |
nと異なる | n <> y (n != y) | test "n" != "y" | if [ "n" != "y" ]; then |
こっちは覚えやすいです。
番外編
testコマンドは、右辺と左辺の比較に対し便利に使えるコマンドですが、まだまだ他にも便利に使えます。
ディレクトリ/ファイルのチェック
ディレクトリやファイルの状態をチェックすることが出来ます。
意味 | testコマンド | if文で使う例 |
---|---|---|
Aファイルの方が新しいか | test fileA -nt fileB | if [ fileA -nt fileB ]; then |
Aファイルの方が古いか | test fileA -ot fileB | if [ fileA -ot fileB ]; then |
パスがファイルか | test -f path | if [ -f path ]; then |
パスがディレクトリか | test -d path | if [ -d path ]; then |
Aファイルが存在するか | test -e fileA | if [ -e fileA ]; then |
Aファイルが空じゃないか | test -s fileA | if [ -s fileA ]; then |
Aファイルが読取可能か | test -r fileA | if [ -r fileA ]; then |
Aファイルが書込可能か | test -w fileA | if [ -w fileA ]; then |
Aファイルが実行可能か | test -x fileA | if [ -x fileA ]; then |
文字列のチェック
文字列の状態をチェックすることが出来ます。
意味 | testコマンド | if文で使う例 |
---|---|---|
文字列が空か | test -z string | if [ -z string ]; then |
文字列が空ではないか | test -n string | if [ -n string ]; then |
複数条件
testコマンドではAND条件やOR条件もちゃんとある
意味 | testコマンド | if文で使う例 |
---|---|---|
条件Aかつ条件B | test [条件A] -a [条件B] | if test [ ... ] -a [ ... ]; then |
条件Aまたは条件B | test [条件A] -o [条件B] | if test [ ... ] -o [ ... ]; then |
※ ifで使う際、if [ [ -z AAA ] -a [ -z bbb ] ];
というように略式で書くことはできなかった。
(方法をご存知な方がいらっしゃいましたら、ぜひご教授ください)
もちろん結合演算子を使い、下記のような書き方も可能
意味 | testコマンド |
---|---|
条件Aかつ条件B | test [条件A] && test [条件B] |
条件Aまたは条件B | test [条件A] || test [条件B] |
[](| ← 表内にパイプを記載したい際のエスケープ)
こちらのほうがわかりやすいかも...?
sample03.sh
#! /bin/bash
strA=あいうえお
strB=ABCDE
strC=""
strD=
#-------------------------------------------------------------------------------
# 単一条件
#-------------------------------------------------------------------------------
if [ -z $strA ]; then
echo "strAは空です。"
else
echo "strAは空ではありません。"
fi
## 結果:strAは空ではありません。
if test -z $strB ; then
echo "strBは空です。"
else
echo "strBは空ではありません。"
fi
## 結果:strBは空ではありません。
if [ -z $strC ]; then
echo "strCは空です。"
else
echo "strCは空ではありません。"
fi
## 結果:strCは空です。
if test -z $strD ; then
echo "strDは空です。"
else
echo "strDは空ではありません。"
fi
## 結果:strDは空です。
#-------------------------------------------------------------------------------
# 複数条件
#-------------------------------------------------------------------------------
# AND条件 ======================================================================
if test -z "${strA}" -a -z "${strB}" ; then
echo "strAとstrBは両方が空です。"
else
echo "strAとstrBは両方が空ではありません。"
fi
## 結果:strAとstrBは両方が空ではありません。
if test -z "${strA}" -a -z "${strC}" ; then
echo "strAとstrCは両方が空です。"
else
echo "strAとstrCは両方が空ではありません。"
fi
## 結果:strAとstrCは両方が空ではありません。
if test -z "${strC}" -a -z "${strD}" ; then
echo "strCとstrDは両方が空です。"
else
echo "strCとstrDは両方が空ではありません。"
fi
## 結果:strCとstrDは両方が空です。
if test -z "${strA}" && test -z "${strC}" ; then
echo "strAとstrCは両方が空です。"
else
echo "strAとstrCは両方が空ではありません。"
fi
## 結果:strAとstrCは両方が空ではありません。
if test -z "${strC}" && test -z "${strD}" ; then
echo "strCとstrDは両方が空です。"
else
echo "strCとstrDは両方が空ではありません。"
fi
## 結果:strCとstrDは両方が空です。
# OR条件 =======================================================================
if test -z "${strA}" -o -z "${strB}" ; then
echo "strAまたはstrBは空です。"
else
echo "strAもstrBも空ではありません。"
fi
## 結果:strAもstrBも空ではありません。
if test -z "${strA}" -o -z "${strC}" ; then
echo "strAまたはstrCは空です。"
else
echo "strAもstrCも空ではありません。"
fi
## 結果:strAまたはstrCは空です。
if test -z "${strC}" -o -z "${strD}" ; then
echo "strCまたはstrDは空です。"
else
echo "strCもstrDも空ではありません。"
fi
## 結果:strCまたはstrDは空です。
if test -z "${strA}" || test -z "${strC}" ; then
echo "strAまたはstrCは空です。"
else
echo "strAもstrCも空ではありません。"
fi
## 結果:strAまたはstrCは空です。
if test -z "${strC}" || test -z "${strD}" ; then
echo "strCまたはstrDは空です。"
else
echo "strCもstrDも空ではありません。"
fi
## 結果:strCまたはstrDは空です。