各シェルでサポートされているさまざまな演算子があります。この章では、Bourneシェル(デフォルトシェル)について詳しく説明します。
次に、以下の演算子について説明します。
- 算術演算子
- 関係演算子
- ブール演算子
- 文字列演算子
- ファイルテスト演算子
Bourneシェルはもともと単純な算術演算を実行するための機構を持っていませんでしたが、awkまたはexprのいずれかの外部プログラムを使用していました。
次の例は、2つの数字を追加する方法を示しています。
#!/bin/sh val=`expr 2 + 2` echo "Total value : $val"
上記のスクリプトは次の結果を生成します –
Total value : 4
追加中に以下の点を考慮する必要があります。
- 演算子と式の間にはスペースが必要です。たとえば、2 + 2は正しくありません。それは2 + 2と書くべきです。
- 完全な表現は、バックティックと呼ばれる“の間に囲まれていなければなりません。
算術演算子
以下の算術演算子は、Bourne Shellでサポートされています。
変数aは10を保持し、変数bは20を保持しているとしましょう。
オペレーター | 説明 | 例 |
---|---|---|
+(加算) | 演算子の両側に値を追加します。 | `expr $ a + $ b`は30を返します |
– (減算) | 左手オペランドから右手オペランドを引く | `expr $ a – $ b`は-10を返します |
*(乗算) | 演算子の両側の値を乗算します。 | `expr $ a \ * $ b`は200を返します |
/(部門) | 左手オペランドを右手オペランドで除算する | `expr $ b / $ a`は2を返します |
%(モジュラス) | 左オペランドを右オペランドで除算し、余りを返します。 | `expr $ b%$ a`は0を返します |
=(代入) | 左オペランドに右オペランドを代入する | a = $ bはbの値をaに代入します。 |
==(等式) | 2つの数字を比較し、両方が同じ場合はtrueを返します。 | [$ a == $ b]はfalseを返します。 |
!=(等しくない) | 2つの数値を比較し、両方が異なる場合はtrueを返します。 | [$ a!= $ b]はtrueを返します。 |
すべての条件式は、角括弧の中にスペースを入れて囲む必要があります。例えば、[$ a == $ b]は正しいですが、[$ a == $ b]は正しくありません。
すべての算術計算は、長い整数を使用して行われます。
#!/bin/sh a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi
上記のスクリプトは、次の結果を生成します –
a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a is not equal to b
算術演算子を使用する場合は、次の点を考慮する必要があります。
関係演算子
Bourne Shellは、数値に固有の以下の関係演算子をサポートしています。これらの演算子は、値が数値でない限り、文字列値に対しては機能しません。
例えば、以下の演算子は、10と20との間、10と20の間の関係をチェックするが、10と20の間の関係はチェックしない。
変数aは10を保持し、変数bは20を保持しているとしましょう
オペレーター | 説明 | 例 |
---|---|---|
-eq | 2つのオペランドの値が等しいかどうかをチェックします。はいの場合、条件は真となります。 | [$ a -eq $ b]は真ではありません。 |
-ne | 2つのオペランドの値が等しいかどうかをチェックします。値が等しくない場合、条件は真となります。 | [$ a -ne $ b]は真です。 |
-gt | 左オペランドの値が右オペランドの値より大きいかどうかをチェックします。はいの場合、条件は真となります。 | [$ a -gt $ b]は真ではありません。 |
-lt | 左オペランドの値が右オペランドの値より小さいかどうかをチェックします。はいの場合、条件は真となります。 | [$ a -lt $ b]は真です。 |
-ge | 左オペランドの値が右オペランドの値以上かどうかをチェックします。はいの場合、条件は真となります。 | [$ a -ge $ b]は真ではありません。 |
-le | 左オペランドの値が右オペランドの値以下であるかどうかをチェックします。はいの場合、条件は真となります。 | [$ a -le $ b]は真です。 |
すべての条件式は、角かっこの中にスペースを入れて配置する必要があることを理解することは非常に重要です。たとえば、[$ a <= $ b]は正しいが、[$ a <= $ b]は間違っている。
#!/bin/sh a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a is equal to b" else echo "$a -eq $b: a is not equal to b" fi if [ $a -ne $b ] then echo "$a -ne $b: a is not equal to b" else echo "$a -ne $b : a is equal to b" fi if [ $a -gt $b ] then echo "$a -gt $b: a is greater than b" else echo "$a -gt $b: a is not greater than b" fi if [ $a -lt $b ] then echo "$a -lt $b: a is less than b" else echo "$a -lt $b: a is not less than b" fi if [ $a -ge $b ] then echo "$a -ge $b: a is greater or equal to b" else echo "$a -ge $b: a is not greater or equal to b" fi if [ $a -le $b ] then echo "$a -le $b: a is less or equal to b" else echo "$a -le $b: a is not less or equal to b" fi
上記のスクリプトは次の結果を生成します –
10 -eq 20: a is not equal to b 10 -ne 20: a is not equal to b 10 -gt 20: a is not greater than b 10 -lt 20: a is less than b 10 -ge 20: a is not greater or equal to b 10 -le 20: a is less or equal to b
ブール演算子
ブール演算子はBourneシェルでサポートされています。
変数aは10を保持し、変数bは20を保持してるとしましょう
オペレーター | 説明 | 例 |
---|---|---|
! | これは論理的な否定です。これは真の条件を偽に反転し、逆に真の条件を偽に反転する。 | [!false]は真です。 |
-o | これは論理ORです。オペランドの1つが真である場合、条件は真となります。 | [$ a -lt 20 -o $ b -gt 100]は真です。 |
-a | これは論理ANDです。両方のオペランドが真である場合、条件は真となり、そうでなければ偽になります。 | [$ a -lt 20 -a $ b -gt 100]はfalseです。 |
#!/bin/sh a=10 b=20 if [ $a != $b ] then echo "$a != $b : a is not equal to b" else echo "$a != $b: a is equal to b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a -lt 100 -a $b -gt 15 : returns true" else echo "$a -lt 100 -a $b -gt 15 : returns false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi
上記のスクリプトは次の結果を生成します –
10 != 20 : a is not equal to b 10 -lt 100 -a 20 -gt 15 : returns true 10 -lt 100 -o 20 -gt 100 : returns true 10 -lt 5 -o 20 -gt 100 : returns false
文字列演算子
Bourne Shellは、以下の文字列演算子をサポートしています。
変数aは “abc”を保持し、変数bは “efg”を保持しているとしましょう。
オペレーター | 説明 | 例 |
---|---|---|
= | 2つのオペランドの値が等しいかどうかをチェックします。はいの場合、条件は真となります。 | [$ a = $ b]は真ではありません。 |
!= | 2つのオペランドの値が等しいかどうかをチェックします。値が等しくない場合、条件は真となります。 | [$ a!= $ b]は真です。 |
-z | 指定された文字列オペランドのサイズがゼロかどうかをチェックします。長さがゼロの場合、trueを返します。 | [-z $ a]は真ではありません。 |
-n | 指定された文字列オペランドのサイズがゼロでないかどうかをチェックします。ゼロ以外の長さの場合はtrueを返します。 | [-n $ a]はfalseではありません。 |
str | strが空の文字列でないかどうかをチェックします。空の場合はfalseを返します。 | [$ a]はfalseではありません。 |
#!/bin/sh a="abc" b="efg" if [ $a = $b ] then echo "$a = $b : a is equal to b" else echo "$a = $b: a is not equal to b" fi if [ $a != $b ] then echo "$a != $b : a is not equal to b" else echo "$a != $b: a is equal to b" fi if [ -z $a ] then echo "-z $a : string length is zero" else echo "-z $a : string length is not zero" fi if [ -n $a ] then echo "-n $a : string length is not zero" else echo "-n $a : string length is zero" fi if [ $a ] then echo "$a : string is not empty" else echo "$a : string is empty" fi
上記のスクリプトは次の結果を生成します –
abc = efg: a is not equal to b abc != efg : a is not equal to b -z abc : string length is not zero -n abc : string length is not zero abc : string is not empty
ファイルテスト演算子
Unixファイルに関連するさまざまなプロパティをテストするために使用できる演算子がいくつかあります。
変数ファイルが、既存のファイル名 “test”を保持していて、そのサイズが100バイトで、読み取り、書き込み、および実行パーミッションが –
オペレーター | 説明 | 例 |
---|---|---|
-bファイル | ファイルがブロック特殊ファイルであるかどうかをチェックします。はいの場合、条件は真となります。 | [-b $ file]はfalseです。 |
-cファイル | ファイルが文字特殊ファイルかどうかをチェックします。はいの場合、条件は真となります。 | [-c $ file]はfalseです。 |
-dファイル | ファイルがディレクトリかどうかをチェックします。はいの場合、条件は真となります。 | [-d $ file]は真ではありません。 |
-fファイル | ファイルがディレクトリまたは特別なファイルではなく普通のファイルであるかどうかをチェックします。はいの場合、条件は真となります。 | [-f $ file]は真です。 |
-gファイル | ファイルに設定されたグループID(SGID)ビットが設定されているかどうかをチェックします。はいの場合、条件は真となります。 | [-g $ file]はfalseです。 |
-kファイル | ファイルにスティッキービットが設定されているかどうかをチェックします。はいの場合、条件は真となります。 | [-k $ file]はfalseです。 |
-pファイル | ファイルが名前付きパイプであるかどうかをチェックします。はいの場合、条件は真となります。 | [-p $ file]はfalseです。 |
-tファイル | ファイル記述子が開いていて端末に関連付けられているかどうかをチェックします。はいの場合、条件は真となります。 | [-t $ file]はfalseです。 |
-uファイル | ファイルにSet User ID(SUID)ビットが設定されているかどうかをチェックします。はいの場合、条件は真となります。 | [-u $ file]はfalseです。 |
-rファイル | ファイルが読み込み可能かどうかをチェックします。はいの場合、条件は真となります。 | [-r $ file]がtrueです。 |
-wファイル | ファイルが書き込み可能かどうかをチェックします。はいの場合、条件は真となります。 | [-w $ file]がtrueです。 |
-xファイル | ファイルが実行可能かどうかをチェックします。はいの場合、条件は真となります。 | [-x $ file]は真です。 |
-sファイル | ファイルのサイズが0より大きいかどうかをチェックします。はいの場合、条件は真となります。 | [-s $ file]は真です。 |
-eファイル | ファイルが存在するかどうかをチェックします。fileがディレクトリであっても存在する場合でもtrueです。 | [-e $ file]は真です。 |
次のページ