⑤Linux入門 基本演算子

スポンサーリンク

本当にわからないとこがあった場合一人では解決できません。
『teratail』とはエンジニア特化型のQ&Aサイトです。 すべてのエンジニアさんが抱えている悩みを共有して 解決するための質問サイトです
無料なのでまずは登録して使ってみてください。メールアドレスだけで登録可能です ----------------------------------------------------------------------------------------

各シェルでサポートされているさまざまな演算子があります。この章では、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]は真です。

次のページ

前のページ

スポンサーリンク

プログラミングは独学からは挫折の可能性が高いです。まずは無料体験ができる
コードキャンプが本当におすすめ。無料体験でわからないところを聞きましょう。
転職補助つき。カリキュラム終了後に転職紹介をしてくれます。