Shell 基本演算子

Shell は他のプログラミング言語と同様に、複数の演算子をサポートしています。以下を含みます:

  • 算術演算子
  • 関係演算子
  • ブール演算子
  • 文字列演算子
  • ファイルテスト演算子

ネイティブ bash は単純な数学演算をサポートしていませんが、awk や expr などの他のコマンドを使用して実現できます。expr が最もよく使用されます。

expr は式の計算ツールであり、これを使用すると式の評価操作を行うことができます。

たとえば、2つの数値を加算する(注意:バッククォートを使用します`シングルクォートではありません'):

例

#!/bin/bash

val=`expr 2 + 2`
echo 2つの数の和は :$val"

スクリプトを実行すると、出力結果は次のようになります。

两数之和为 : 4

2つの注意点:

  • 式と演算子の間にはスペースが必要です。たとえば、2+2 は正しくありません。2 + 2 と記述する必要があります。これは私たちが慣れ親しんだほとんどのプログラミング言語とは異なります。
  • 完全な式は` `` で囲む必要があります。この文字は通常の一重引用符ではなく、Esc キーの下にあることに注意してください。

算術演算子

次の表は一般的な算術演算子を示しています。変数 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/bash
# author:サンプル
# url:www.example.com

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 は b と等しい
fi
if [ $a != $b ]
then
   echo a は b と等しくない
fi

スクリプトを実行すると、出力結果は次のようになります。

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意:

  • 乗算記号(*)の前にはバックスラッシュ(\)を付けて乗算を実行する必要があります。
  • if...then...fi は条件文であり、後で説明します。
  • MAC では、shell の expr 構文は次のとおりです:$((式))ここでは式中の "*" にエスケープ記号 "\" は必要ありません。

関係演算子

関係演算子は数値のみをサポートし、文字列はサポートしません。ただし、文字列の値が数値である場合は除きます。

次の表は一般的な関係演算子を示しています。変数 a が 10、変数 b が 20 とします。

演算子 説明 例
-eq 2つの数が等しいかどうかを検出し、等しければ true を返します。 [ $a -eq $b ] は false を返します。
-ne 2つの数が等しくないかどうかを検出し、等しくなければ true を返します。 [ $a -ne $b ] は true を返します。
-gt 左の数が右の数より大きいかどうかを検出し、大きければ true を返します。 [ $a -gt $b ] は false を返します。
-lt 左の数が右の数より小さいかどうかを検出し、小さければ true を返します。 [ $a -lt $b ] は true を返します。
-ge 左の数が右の数以上かどうかを検出し、以上であれば true を返します。 [ $a -ge $b ] は false を返します。
-le 左の数が右の数以下かどうかを検出し、以下であれば true を返します。 [ $a -le $b ] は true を返します。

例

関係演算子の例は次のとおりです。

例

#!/bin/bash
# author:サンプル
# url:www.example.com

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b: a は b と等しい
else
   echo "$a -eq $b: a は b と等しくない
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a は b と等しくない
else
   echo "$a -ne $b: a は b と等しい
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a は b より大きい
else
   echo "$a -gt $b: a は b より大きくない
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a は b より小さい
else
   echo "$a -lt $b: a は b より小さくない
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a は b 以上
else
   echo "$a -ge $b: a は b より小さい
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a は b 以下
else
   echo "$a -le $b: a は b より大きい
fi

スクリプトを実行すると、出力結果は次のようになります。

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

ブール演算子

次の表は一般的なブール演算子を示しています。変数 a が 10、変数 b が 20 とします。

演算子 説明 例
! 否定演算。式が true であれば false を返し、それ以外は true を返します。 [ ! false ] は true を返します。
-o 論理和。いずれかの式が true であれば true を返します。 [ $a -lt 20 -o $b -gt 100 ] は true を返します。
-a 論理積。両方の式が true の場合のみ true を返します。 [ $a -lt 20 -a $b -gt 100 ] は false を返します。

例

ブール演算子の例は次のとおりです。

例

#!/bin/bash
# author:サンプル
# url:www.example.com

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b: a は b と等しくない
else
   echo "$a == $b: a は b と等しい
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a100 未満かつ$b15 より大きい : true を返す
else
   echo "$a100 未満かつ$b15 より大きい : false を返す
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a100 未満 または$b100 より大きい : true を返す
else
   echo "$a100 未満 または$b100 より大きい : false を返す
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a5 未満 または$b100 より大きい : true を返す
else
   echo "$a5 未満 または$b100 より大きい : false を返す
fi

スクリプトを実行すると、出力結果は次のようになります。

10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

論理演算子

以下、Shell の論理演算子を説明します。変数 a が 10、変数 b が 20 とします:

演算子 説明 例
&& 論理積 (AND) [[ $a -lt 100 && $b -gt 100 ]] は false を返します
|| 論理和 (OR) [[ $a -lt 100 || $b -gt 100 ]] は true を返します

例

論理演算子の例は次のとおりです。

例

#!/bin/bash
# author:サンプル
# url:www.example.com

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo true を返す
else
   echo false を返す
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo true を返す
else
   echo false を返す
fi

スクリプトを実行すると、出力結果は次のようになります:

返回 false
返回 true

文字列演算子

次の表に、よく使われる文字列演算子を示します。変数 a は "abc"、変数 b は "efg" とします:

演算子 説明 例
= 2つの文字列が等しいかどうかを調べ、等しければ true を返します。 [ $a = $b ] は false を返します。
!= 2つの文字列が等しくないかどうかを調べ、等しくなければ true を返します。 [ $a != $b ] は true を返します。
-z 文字列の長さが 0 かどうかを調べ、0 であれば true を返します。 [ -z $a ] は false を返します。
-n 文字列の長さが 0 でないかどうかを調べ、0 でなければ true を返します。 [ -n "$a" ] は true を返します。
$ 文字列が空でないかどうかを調べ、空でなければ true を返します。 [ $a ] は true を返します。

例

文字列演算子の例は次のとおりです:

例

#!/bin/bash
# author:サンプル
# url:www.example.com

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b: a は b と等しい"
else
   echo "$a = $b: a は b と等しくない"
fi
if [ $a != $b ]
then
   echo "$a != $b: a は b と等しくない"
else
   echo "$a != $b: a は b と等しい"
fi
if [ -z $a ]
then
   echo "-z $a: 文字列の長さは 0"
else
   echo "-z $a: 文字列の長さは 0 ではない"
fi
if [ -n "$a" ]
then
   echo "-n $a: 文字列の長さは 0 ではない"
else
   echo "-n $a: 文字列の長さは 0"
fi
if [ $a ]
then
   echo "$a: 文字列は空ではない"
else
   echo "$a: 文字列は空"
fi

スクリプトを実行すると、出力結果は次のようになります:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

ファイルテスト演算子

ファイルテスト演算子は、Unix ファイルのさまざまな属性を調べるために使用します。

属性の検出について説明します。

演算子 説明 例
-b file ファイルがブロックデバイスファイルであるかどうかを調べ、そうであれば true を返します。 [ -b $file ] は false を返します。
-c file ファイルがキャラクタデバイスファイルであるかどうかを調べ、そうであれば true を返します。 [ -c $file ] は false を返します。
-d file ファイルがディレクトリであるかどうかを調べ、そうであれば true を返します。 [ -d $file ] は false を返します。
-f file ファイルが通常のファイル(ディレクトリでもデバイスファイルでもない)であるかどうかを調べ、そうであれば true を返します。 [ -f $file ] は true を返します。
-g file ファイルに SGID ビットが設定されているかどうかを調べ、設定されていれば true を返します。 [ -g $file ] は false を返します。
-k file ファイルにスティッキービット(Sticky Bit)が設定されているかどうかを調べ、設定されていれば true を返します。 [ -k $file ] は false を返します。
-p file ファイルが名前付きパイプであるかどうかを調べ、そうであれば true を返します。 [ -p $file ] は false を返します。
-u file ファイルに SUID ビットが設定されているかどうかを調べ、設定されていれば true を返します。 [ -u $file ] は false を返します。
-r file ファイルが読み取り可能かどうかを調べ、可能であれば true を返します。 [ -r $file ] は true を返します。
-w file ファイルが書き込み可能かどうかを調べ、可能であれば true を返します。 [ -w $file ] は true を返します。
-x file ファイルが実行可能かどうかを調べ、可能であれば true を返します。 [ -x $file ] は true を返します。
-s file ファイルが空であるかどうか(ファイルサイズが 0 より大きいかどうか)を調べ、空でなければ true を返します。 [ -s $file ] は true を返します。
-e file ファイル(ディレクトリを含む)が存在するかどうかを調べ、存在すれば true を返します。 [ -e $file ] は true を返します。

その他のチェック演算子:

  • -S: ファイルがソケットであるかどうかを判定します。
  • -L: ファイルが存在し、かつシンボリックリンクであるかどうかを調べます。

例

変数 file はファイルを表します/var/www/サンプル/test.sh、そのサイズは 100 バイトで、rwx権限を持っています。次のコードでは、このファイルのさまざまな属性を調べます:

例

#!/bin/bash
# author:サンプル
# url:www.example.com

file="/var/www/サンプル/test.sh"
if [ -r $file ]
then
   echo "ファイルは読み取り可能"
else
   echo "ファイルは読み取り不可"
fi
if [ -w $file ]
then
   echo "ファイルは書き込み可能"
else
   echo "ファイルは書き込み不可"
fi
if [ -x $file ]
then
   echo "ファイルは実行可能"
else
   echo "ファイルは実行不可"
fi
if [ -f $file ]
then
   echo "ファイルは通常のファイルです"
else
   echo "ファイルは特殊なファイルです"
fi
if [ -d $file ]
then
   echo "ファイルはディレクトリです"
else
   echo "ファイルはディレクトリではありません"
fi
if [ -s $file ]
then
   echo "ファイルは空ではありません"
else
   echo "ファイルは空です"
fi
if [ -e $file ]
then
   echo "ファイルは存在します"
else
   echo "ファイルは存在しません"
fi

スクリプトを実行すると、出力結果は次のようになります:

ファイルが読み取り可能
ファイルが書き込み可能
ファイルが実行可能
ファイルが通常ファイルである
ファイルがディレクトリではない
ファイルが空ではない
ファイルが存在する

インクリメント演算子とデクリメント演算子

Shell には C、C++、Java のような ++ や -- 演算子はありませんが、他の方法で同じ機能を実現できます。以下にいくつかの一般的な方法を示します。

let コマンドを使用する

letこのコマンドは整数の算術演算を行うことができます。

例

#!/bin/bash

# 変数の初期化
num=5

# インクリメント
let num++

# デクリメント
let num--

echo $num

$(( )) を使用した算術演算

$(( ))この構文も算術演算を行う方法の1つです。

例

#!/bin/bash

# 変数の初期化
num=5

# インクリメント
num=$((num + 1))

# デクリメント
num=$((num - 1))

echo $num

expr コマンドを使用する

exprこのコマンドは算術演算に使用できますが、現代のスクリプトではletと$(( ))あまり一般的ではありません。

例

#!/bin/bash

# 変数の初期化
num=5

# インクリメント
num=$(expr $num + 1)

# デクリメント
num=$(expr $num - 1)

echo $num

(( )) を使用した算術演算

$(( )) と同様に、(( )) 構文も算術演算に使用できます。

例

#!/bin/bash

# 変数の初期化
num=5

# インクリメント
((num++))

# デクリメント
((num--))

echo $num

例

以下は、インクリメント操作とデクリメント操作の使用を示す完全なサンプルスクリプトです:

例

#!/bin/bash

# 変数の初期化
num=5

echo "初期値:$num"

# インクリメント
let num++
echo "インクリメント後:$num"

# デクリメント
let num--
echo "デクリメント後:$num"

# $(( )) を使用
num=$((num + 1))
echo "使用$(( )) インクリメント後:$num"

num=$((num - 1))
echo "使用$(( )) デクリメント後:$num"

# expr を使用
num=$(expr $num + 1)
echo "expr を使用したインクリメント後:$num"

num=$(expr $num - 1)
echo "expr を使用したデクリメント後:$num"

# (( )) を使用
((num++))
echo "(( )) を使用したインクリメント後:$num"

((num--))
echo "(( )) を使用したデクリメント後:$num"

このスクリプトを実行すると、次の内容が出力されます:

初始值: 5
自增后: 6
自减后: 5
使用 $(( )) 自增后: 6
使用 $(( )) 自减后: 5
使用 expr 自增后: 6
使用 expr 自减后: 5
使用 (( )) 自增后: 6
使用 (( )) 自减后: 5
その他の拡張