Hitachi

JP1 Version 11 JP1/Advanced Shell 


5.2.2 条件式

条件式では,数値比較,文字列比較,ファイル属性,論理演算子および三項演算子を使用します。

条件式の共通仕様を次に説明します。

〈この項の構成〉

(1) 数値比較

数値の比較に使用する演算子を次の表に示します。なお,数値1,および数値2は-2147483648~2147483647の範囲内で指定してください。範囲外の値を指定した場合,正しい結果を求めることができないため,注意してください。

表5‒22 testコマンドで数値を比較するときに使用する演算子

演算子を使った条件式

判定

数値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より小さい場合は真。

表5‒23 letコマンドで数値を比較する時に使用する演算子

演算子を使った条件式

判定

数値1 == 数値2

数値1と数値2が等しい場合は真。

数値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コマンド,(( ))では使用できません。

表5‒24 文字列の比較に使用する演算子

演算子を使った条件式

判定

文字列

文字列の長さが1文字以上の場合は真。ただし,[[ ]]コマンドでは使用できません。

-n 文字列

文字列の長さが1文字以上の場合は真。

文字列の長さが0なら,KNAX6041-Eメッセージを出力し,終了コード2でエラー終了します。ただし,[[ ]]コマンドで文字列を指定しなかった場合は書式不正となり,KNAX6041-Eメッセージを出力し,終了コード1でエラー終了します。

-z 文字列

文字列の長さが0の場合は真。

-o 文字列

文字列が現在有効に設定されているシェルオプションの文字列と一致する場合は真。

シェルオプションの文字列については,「5.6.1 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) ワイルドカード」を参照してください。

(3) ファイル属性

ファイルの形式や権限などの属性を評価する場合に使用する演算子を次の表に示します。ファイル属性評価の演算子はtestコマンド,[[ ]],[ ]で使用できます。letコマンド,(( ))では使用できません。

表5‒25 ファイルの形式や権限などの属性を評価する演算子

演算子を使った条件式

判定

-a file

fileが存在する場合は真。

-b file

fileが存在し,ブロック型デバイスの場合は真。

-c file

fileが存在し,キャラクタ型デバイスの場合は真。

-d file

fileが存在し,ディレクトリの場合は真。

-e file

fileが存在する場合は真。

-f file

fileが存在し,通常ファイルの場合は真。

-g file

fileが存在し,setgidビットがセットされている場合は真。

-h file

fileが存在し,シンボリックリンクの場合は真。

-k file

fileが存在し,スティッキービットがセットされている場合は真。

-p file

fileが存在し,パイプファイルの場合は真。

-r file

Windowsの場合,fileが存在する場合は真。

UNIXの場合,fileが存在し,カレントプロセスから読み込み可能なときは真。

-s file

次の条件をすべて満たす場合は真。

【Windowsの場合】

  • fileが存在する

  • fileがフォルダ以外である

  • ファイルサイズが1バイト以上である

【UNIXの場合】

  • fileが存在する

  • ファイルサイズが1バイト以上,またはディレクトリである

-sはUNIXとWindowsで真の条件が異なるため,ディレクトリまたはフォルダの存在チェックには-dを使用してください。

-t fd

端末をオープンしているfdの場合は真。

-u file

fileが存在し,setuidビットがセットされている場合は真。

-w file

Windowsの場合,読み取り専用属性が設定されていないか,またはディレクトリのときは真。

UNIXの場合,fileが存在し,カレントプロセスから書き込み可能なときは真。

-x file

【Windowsの場合】

次のどれかに該当するときは真。

  • fileがシンボリックリンク以外の場合

    ・拡張子が「.com」,「.exe」,「.cmd」または「.bat」である

    ・ディレクトリである

    ・環境ファイルのCHILDJOB_EXTパラメーターまたはCHILDJOB_SHEBANGパラメーター(デフォルト定義含む)で設定した条件に一致するファイルである

  • fileがシンボリックリンクの場合

    ・シンボリックリンク,およびリンク先ファイルの拡張子が「.com」,「.exe」,「.cmd」または「.bat」である

    ・ディレクトリへのシンボリックリンク,かつ参照先がディレクトリである。

【UNIXの場合】

fileが存在し,カレントプロセスから実行可能なときは真。

-G file

fileが存在し,fileが属するグループが呼び出し元のプロセスの実効グループIDと一致している場合は真。

-L file

fileが存在し,シンボリックリンクの場合は真。

-O file

fileが存在し,所有者がプロセスの有効ユーザーIDの場合は真。

-S file

fileが存在し,ソケットの場合は真。

file1 -ef file2

file1とfile2が存在し,file1とfile2の実体が同じ(シンボリックリンク先が同じまたはハードリンク先が同じ)場合は真。

file1 -nt file2

file1とfile2が存在し,file1の最終修正日時がfile2よりも新しい場合は真。また,file1が存在し,file2が存在しない場合も真。

file1 -ot file2

file1とfile2が存在し,file1の最終修正日時がfile2よりも古い場合は真。また,file2が存在し,file1が存在しない場合も真。

-H file

常に偽。

注※

CHILDJOB_SHEBANGパラメーターの詳細については,「7.3.7 CHILDJOB_SHEBANGパラメーター(子孫ジョブとして実行するジョブ定義スクリプトファイルの実行プログラムパスを定義する)」を参照してください。

CHILDJOB_EXTパラメーターの詳細については,「7.3.5 CHILDJOB_EXTパラメーター(子孫ジョブとして実行するジョブ定義スクリプトファイルの拡張子を定義する)」を参照してください。

ファイル属性の演算子を使用する際の注意事項を次に示します。

ファイル属性の使用例を次に示します。

FILE="$HOME/script/test.ash"
if [[ -a $FILE ]];
then
  echo "$FILE exists."
else
  echo "$FILE does not exist."
fi

(4) 論理演算

論理演算で評価する場合に使用する演算子を次の表に示します。

表5‒26 論理演算で評価する場合に使用する演算子

演算子を使った条件式

判定

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で使用できる三項演算子を次の表に示します。三項演算子はletコマンド,(( ))で使用できます。testコマンド,[[ ]],[ ]では使用できません。

表5‒27 JP1/Advanced Shellで使用できる三項演算子

演算子を使った条件式

判定

expr1?expr2: expr3

expr1の結果が真であればexpr2の結果,偽であればexpr3の結果を返します。

三項演算子の使用例を次に示します。

VAR1=3
VAR2=2
ANSWER=0
 
((ANSWER=VAR1>VAR2?8+VAR1:8*VAR2))
echo $ANSWER