5.2.2 条件式
条件式では,数値比較,文字列比較,ファイル属性,論理演算子および三項演算子を使用します。
条件式の共通仕様を次に説明します。
-
testコマンドまたはletコマンドを使用して条件評価を行います。
testコマンドは代替書式である[]および[[]]を含みます。また,letコマンドは代替書式である(())を含みます。
-
testコマンドを使用して条件評価する場合,変数と演算子の間にスペースを入れてください。[[]]を使用する場合は,「[[」の直後と「]]」の直前にスペースを入れてください。
[[]]を使用して条件判定するときの使用例を次に示します。
if [[ $arg1 -eq $args ]]; then echo TRUE fi
-
letコマンドの引数にtestコマンドの引数(-eqなど)を指定した場合,letコマンドは変数と解釈して動作します。
- 〈この項の構成〉
(1) 数値比較
数値の比較に使用する演算子を次の表に示します。
演算子を使った条件式 |
判定 |
testコマンドでの使用可否 |
letコマンドでの使用可否 |
---|---|---|---|
数値1 -eq 数値2 |
数値1と数値2が等しい場合は真。 |
○ |
× |
数値1 -ne 数値2 |
数値1と数値2が等しくない場合は真。 |
○ |
× |
数値1 -ge 数値2 |
数値1が数値2以上の場合は真。 |
○ |
× |
数値1 -gt 数値2 |
数値1が数値2より大きい場合は真。 |
○ |
× |
数値1 -le 数値2 |
数値1が数値2以下の場合は真。 |
○ |
× |
数値1 -lt 数値2 |
数値1が数値2より小さい場合は真。 |
○ |
× |
数値1 == 数値2 |
数値1と数値2が等しい場合は真。 |
○※1 |
○ |
数値1 != 数値2 |
数値1と数値2が等しくない場合は真。 |
○※1 |
○ |
数値1 >= 数値2 |
数値1が数値2以上の場合は真。 |
× |
○ |
数値1 > 数値2 |
数値1が数値2より大きい場合は真。 |
○※1※2 |
○ |
数値1 < 数値2 |
数値1が数値2より小さい場合は真。 |
○※1※2 |
○ |
数値1 <= 数値2 |
数値1が数値2以下の場合は真。 |
× |
○ |
数値比較の使用例を次に示します。
a=1 b=2 if [[ $a -lt $b ]]; then echo TRUE else echo FALSE fi while (( $a != $b )); do echo LOOP ((a+=1)) done
(2) 文字列比較
文字列の比較に使用する演算子を次の表に示します。
演算子を使った条件式 |
判定 |
testコマンドでの使用可否 |
letコマンドでの使用可否 |
---|---|---|---|
文字列 |
文字列の長さが1文字以上の場合は真。ただし,[[ ]]コマンドでは使用できません。 |
○ |
× |
-n 文字列 |
文字列の長さが1文字以上の場合は真。 文字列の長さが0なら,KNAX6041-Eメッセージを出力し,終了コード2でエラー終了します。ただし,[[ ]]コマンドで文字列を指定しなかった場合は書式不正となり,KNAX6041-Eメッセージを出力し,終了コード1でエラー終了します。 |
○ |
× |
-z 文字列 |
文字列の長さが0の場合は真。 |
○ |
× |
-o 文字列 |
文字列が現在有効に設定されているシェルオプションの文字列と一致する場合は真。 シェルオプションの文字列については,「5.6.1 setコマンドで設定できるシェルオプション」の「表5-34 setコマンドで設定できるシェルオプション」の「名称」を参照してください。 |
○ |
× |
文字列 = pattern |
文字列とpatternが一致する場合は真。 |
○ |
× |
文字列 == pattern |
文字列とpatternが一致する場合は真。 |
○ |
× |
文字列 != pattern |
文字列とpatternが不一致の場合は真。 |
○ |
× |
文字列1 < 文字列2 |
文字列1と文字列2をASCIIコード順に比較します。文字列1より文字列2が大きい場合は真。 |
○※ |
× |
文字列1 > 文字列2 |
文字列1と文字列2をASCIIコード順に比較します。文字列1より文字列2が小さい場合は真。 |
○※ |
× |
比較する文字列にはスペースなどが含まれる場合があるため,"(ダブルクォーテーション)で囲むことを推奨します。使用例を次に示します。
str1="aaa" str2="bbb" test "$str1" == "$str2" [[ "$str1" == "$str2" ]]
比較する文字列には*,?,[…]のワイルドカードが指定できます。ただし,[[ ]]だけで使用できます。その他の書式ではワイルドカードを使用できません。また,ワイルドカードを使用した文字列を"(ダブルクォーテーション)で囲んだ場合,ワイルドカードが持つ意味が無効化されてしまうため,注意してください。使用例を次に示します。
str1="adsh" str2="ads?" str3="ad*" [[ "$str1" == "$str2" ]] ←ワイルドカードが無効。文字列"ads?"の比較をする [[ $str1 != $str3 ]] ←ワイルドカードが有効
[[ ]]による文字列比較の使用例を次に示します。ワイルドカードは,*,?,[…]が指定できます。
if [[ abc == ab* ]]; then echo TRUE fi
ワイルドカードについては,「5.1.6(5) ワイルドカード」を参照してください。
(3) ファイル属性
ファイルの形式や権限などの属性を評価する場合に使用する演算子を次の表に示します。
演算子を使った条件式 |
判定 |
testコマンドでの使用可否 |
letコマンドでの使用可否 |
---|---|---|---|
-a file |
fileが存在する場合は真。 |
○ |
× |
-b file |
fileが存在し,ブロック型デバイスの場合は真。※1 |
○ |
× |
-c file |
fileが存在し,キャラクタ型デバイスの場合は真。※1 |
○ |
× |
-d file |
fileが存在し,ディレクトリの場合は真。 |
○ |
× |
-e file |
fileが存在する場合は真。 |
○ |
× |
-f file |
fileが存在し,通常ファイルの場合は真。 |
○ |
× |
-g file |
fileが存在し,setgidビットがセットされている場合は真。※1 |
○ |
× |
-h file |
fileが存在し,シンボリックリンクの場合は真。※2 |
○ |
× |
-k file |
fileが存在し,スティッキービットがセットされている場合は真。※1 |
○ |
× |
-p file |
fileが存在し,パイプファイルの場合は真。※1 |
○ |
× |
-r file |
Windowsの場合,fileが存在する場合は真。 UNIXの場合,fileが存在し,カレントプロセスから読み込み可能なときは真。 |
○ |
× |
-s file |
次の条件をすべて満たす場合は真。 【Windowsの場合】
【UNIXの場合】
-sはUNIXとWindowsで真の条件が異なるため,ディレクトリまたはフォルダの存在チェックには-dを使用してください。 |
○ |
× |
-t fd |
端末をオープンしているfdの場合は真。※3 |
○ |
× |
-u file |
fileが存在し,setuidビットがセットされている場合は真。※1 |
○ |
× |
-w file |
Windowsの場合,読み取り専用属性が設定されていないか,またはディレクトリのときは真。 UNIXの場合,fileが存在し,カレントプロセスから書き込み可能なときは真。 |
○ |
× |
-x file |
Windowsの場合,次のどれかに該当するときは真。
UNIXの場合,fileが存在し,カレントプロセスから実行可能なときは真。 |
○ |
× |
-G file |
fileが存在し,fileが属するグループが呼び出し元のプロセスの実効グループIDと一致している場合は真。※2 |
○ |
× |
-L file |
fileが存在し,シンボリックリンクの場合は真。※2 |
○ |
× |
-O file |
fileが存在し,所有者がプロセスの有効ユーザーIDの場合は真。※2 |
○ |
× |
-S file |
fileが存在し,ソケットの場合は真。※1 |
○ |
× |
file1 -ef file2 |
file1とfile2が存在し,file1とfile2の実体が同じ(シンボリックリンク先が同じまたはハードリンク先が同じ)場合は真。※2 |
○ |
× |
file1 -nt file2 |
file1とfile2が存在し,file1の最終修正日時がfile2よりも新しい場合は真。また,file1が存在し,file2が存在しない場合も真。 |
○ |
× |
file1 -ot file2 |
file1とfile2が存在し,file1の最終修正日時がfile2よりも古い場合は真。また,file2が存在し,file1が存在しない場合も真。 |
○ |
× |
-H file |
常に偽。 |
○ |
× |
ファイル属性の使用例を次に示します。
FILE="$HOME/script/test.ash" if [[ -a $FILE ]]; then echo "$FILE exists." else echo "$FILE does not exist." fi
(4) 論理演算
論理演算で評価する場合に使用する演算子を次の表に示します。
演算子を使った条件式 |
判定 |
testコマンドでの使用可否 |
letコマンドでの使用可否 |
---|---|---|---|
expr1 -a expr2 |
expr1とexpr2の結果が両方とも真の場合,真。 |
○※ |
× |
expr1 -o expr2 |
expr1とexpr2の結果がどちらか一方でも真の場合,真。 |
○※ |
× |
expr1 && expr2 |
expr1とexpr2の結果が両方とも真の場合,真。 |
○ |
○ |
expr1 || expr2 |
expr1とexpr2の結果がどちらか一方でも真の場合,真。 |
○ |
○ |
! expr |
exprの結果が偽の場合,真。 |
○ |
○ |
論理演算の使用例を次に示します。
DIR="/tmp" FILE="/tmp/test.ash" a=2 b=4 if test -d $DIR -a -a $FILE then echo "$DIR is directory and $FILE exists." else echo "$DIR is not directory or $FILE does not exist." fi while ((a*0 || b-3)); do echo LOOP let b-=1 done
ただし,testコマンドで論理演算子「&&」および「||」を使用する場合は,次のように記述してください。
a=1 b=2 c=3 if test "$a" == 1 && test "$b" == 2; then echo "True" else echo "False" fi if test "$a" != "$b" || test "$a" != "$c"; then echo "True" else echo "False" fi
(5) 三項演算子
if-elseの省略記法である三項演算子を使用できます。JP1/Advanced Shellで使用できる三項演算子を次の表に示します。
演算子を使った条件式 |
判定 |
testコマンドでの使用可否 |
letコマンドでの使用可否 |
---|---|---|---|
expr1?expr2: expr3 |
expr1の結果が真であればexpr2の結果,偽であればexpr3の結果を返します。 |
× |
○ |
三項演算子の使用例を次に示します。
VAR1=3 VAR2=2 ANSWER=0 ((ANSWER=VAR1>VAR2?8+VAR1:8*VAR2)) echo $ANSWER