English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Shell 基本演算子

Shell は他のプログラミング言語と同様に、以下のような様々な演算子をサポートしています:

  • 算数演算子

  • 関係演算子

  • ブール演算子

  • 文字演算子

  • ファイルテスト演算子

原生的 bash は簡単な数学演算をサポートしていませんが、awk や expr などの他のコマンドを使用して実現できます。expr は最も常用されます。

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

例えば、2つの数を足す(使用しているのは反引号 ` ではなく、単引号 ' です。):

#!/bin/bash
val=`expr 2 + 2`
echo "2つの数の和は : $val"

スクリプトを実行し、以下の結果を出力します:

2つの数の和は : 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
# 著者: 基礎チュートリアル
# url:ja.oldtoolbag.com
a=10
b=20
 + $b`
echo "a + b : $val"
 - $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                    二つの数が等しいかどうかを検出し、はいの場合は true を返します。                    [ $a -eq $b ] 返り値 false。
                    -ne                    二つの数が異なるかどうかを検出し、異なる場合は 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:ja.oldtoolbag.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
# 著者: 基礎チュートリアル
# url:ja.oldtoolbag.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 "$a が小さい 100 : $b が大きい 15 : true を返します"
else
   echo "$a が小さい 100 : $b が大きい 15 : false を返します"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a が小さい 100 : $b が大きい 100 : true を返します"
else
   echo "$a が小さい 100 : $b が大きい 100 : false を返します"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a が小さい 5 または $b が大きい 100 : true を返します"
else
   echo "$a が小さい 5 または $b が大きい 100 : 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:ja.oldtoolbag.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" と仮定します:

                    演算子                    説明                    例
                    =                    二つの文字が同じかどうかを検出し、同じ場合は true を返します。                    [ $a = $b ] は false を返します。
                    !=                    二つの文字が異なるかどうかを検出し、異なる場合は 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:ja.oldtoolbag.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/w3codebox/test.sh、サイズが 100 バイト、次のように rwx 権限。以下のコードでは、ファイルの様々な属性を検出します:
#!/bin/bash
# author:基礎教程網
# url:ja.oldtoolbag.com
file="/var/www/w3codebox/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

スクリプトを実行し、以下の結果を出力します:

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