シェルの基本演算子
シェルは、次のようなさまざまな演算子をサポートしています。
- 算術演算子
- 関係演算子
- ブール演算子
- 文字列演算子
- ファイルテストオペレーター
ネイティブbashは単純な数学演算をサポートしていませんが、awkやexprなどの他のコマンドを使用して実現できます。exprが最も一般的に使用されます。
exprは、式の評価に使用できる式評価ツールです。
たとえば、2つの数字を追加します(一重引用符の代わりに「バッククォート」を使用していることに注意してください)。
#!/bin/bash
val=`expr 2 + 3`
echo "两数之和为 : $val"
スクリプトを実行すると、出力は次のようになります。
两数之和为 : 5
ここに注意してください:
式と演算子の間にはスペースが必要です。たとえば、2 + 2は間違っており、2 + 2と記述する必要があります。これは、私たちが慣れ親しんでいるほとんどのプログラミング言語とは異なります。
完全な式は``で囲む必要があります。この文字は、Escキーの下にある通常の一重引用符ではないことに注意してください。
1.算術演算子
次の表に、変数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
a=10
b=20
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
スクリプトを実行すると、出力は次のようになります。
b % a : 0
a 不等于 b
知らせ:
- 乗算を実行するには、乗算記号(*)の前に円記号(\)を付ける必要があります。
- if ... then ... fiは条件文であり、これについては後で説明します。
- MACのシェルのexpr構文は次のとおりです。$((expression))、ここで、式の「*」はエスケープ記号「\」を必要としません。
1.1拡張
算術演算の場合、次のように書くこともできます。
- 使用する[]
#!/bin/bash
num1=10
num2=16
echo "num1+num2="$[num1+num2]
echo "num1-num2="$[num1-num2]
echo "num1*num2="$[num1*num2]
echo "num1/num2="$[num1/num2]
echo "num2/num1="$[num2/num1]
スクリプトを実行すると、出力は次のようになります。
num1+num2=26
num1-num2=-6
num1*num2=160
num1/num2=0
num2/num1=1
注:除算を行う場合、整数部分のみが表示され、小数部分は表示されません。
- 使用する(())
#!/bin/bash
num1=10
num2=16
echo "num1+num2="$(($num1+$num2))
echo "num1-num2="$(($num1-$num2))
echo "num1*num2="$(($num1*$num2))
echo "num1/num2="$(($num1/num2))
echo "num2/num1="$(($num2/$num1))
スクリプトを実行すると、出力は次のようになります。
num1+num2=26
num1-num2=-6
num1*num2=160
num1/num2=0
num2/num1=1
注:除算を行う場合、整数部分のみが表示され、小数部分は表示されません。
- 10進演算
scale = n; 10進数の精度を定義します。さらに、入力操作に対してbcコマンドを直接実行できます。
#!/bin/bash
num1=1.8
num2=2.2
echo "scale=3;$num1+$num2"|bc
echo "scale=2;$num1-$num2"|bc
echo "scale=2;$num2-$num1"|bc
echo "scale=2;$num1*$num2"|bc
echo "scale=2;$num1/$num2"|bc
echo "scale=2;$num2/$num1"|bc
echo "scale=3;$num1/$num2"|bc
スクリプトを実行すると、出力は次のようになります。
4.0
-.4 # -0.4
.4 # 0.4
3.96
.81 # 0.81
1.22
.818 # 0.818
10進数の精度の変化に注意してください。また、整数部が0の場合は省略します。同時に、小数部分は切り捨てられ、四捨五入されません。
2.関係演算子
関係演算子は、文字列の値が数値でない限り、文字列ではなく数値のみをサポートします。
次の表に、変数aが10で、変数bが20であると仮定して、一般的に使用される関係演算子を示します。
オペレーター | 説明する | 例 |
---|---|---|
-eq | 2つの数値が等しいかどうかを確認し、等しい場合はtrueを返します。 | [$ a -eq$b]はfalseを返します。 |
-生まれ | 2つの数値が等しくないかどうかを確認し、等しくない場合はtrueを返します。 | [$ a -ne$b]はtrueを返します。 |
-gt | 左側の数値が右側の数値よりも大きいかどうかを確認し、大きい場合はtrueを返します。 | [$ a -gt$b]はfalseを返します。 |
-lt | 左側の数値が右側の数値よりも小さいかどうかを確認し、小さい場合はtrueを返します。 | [$ a -lt$b]はtrueを返します。 |
-与える | 左側の数値が右側の数値以上であるかどうかを確認し、大きい場合はtrueを返します。 | [$ a -ge$b]はfalseを返します。 |
- | 左側の数値が右側の数値以下であるかどうかを確認し、等しい場合はtrueを返します。 | [$ a -le$b]はtrueを返します。 |
3.ブール演算子
次の表に、変数aが10、変数bが20であると仮定した場合の、一般的なブール演算子を示します。
オペレーター | 説明する | 例 |
---|---|---|
! | NOT演算、式がtrueの場合はfalseを返し、それ以外の場合はtrueを返します。 | [!false]はtrueを返します。 |
-O | OR演算。式の1つがtrueの場合、trueを返します。 | [$ a -lt 20 -o $ b-gt100]はtrueを返します。 |
-a | AND演算は、両方の式が真の場合に真を返します。 | [$ a -lt 20 -a $ b-gt100]はfalseを返します。 |
4.論理演算子
次に、変数aが10で、変数bが20であると仮定して、シェルの論理演算子について説明します。
オペレーター | 説明する | 例 |
---|---|---|
&& | 論理積 | [[$ a -lt 100 && $ b-gt100]]返回false |
|| | 論理和 | [[$ a -lt 100 || $ b-gt100]]はtrueを返します |
例:
#!/bin/bash
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-oを使用できます
三項演算子:
[条件]&&echo 1 || echo 2:条件が満たされた場合は、&&;の後にステートメントを実行します。条件が満たされない場合は、||の後にステートメントを実行します。
5.文字列演算子
次の表に、変数aが「abc」で変数bが「efg」であると仮定した場合の一般的な文字列演算子を示します。
オペレーター | 説明する | 例 |
---|---|---|
= | 2つの文字列が等しいかどうかをチェックし、等しい場合はtrueを返します。 | [$ a =$b]はfalseを返します。 |
!= | 2つの文字列が等しくないかどうかをチェックし、等しくない場合はtrueを返します。 | [$ a!=$b]はtrueを返します。 |
-と | 文字列の長さが0かどうかを確認し、0の場合はtrueを返します。 | [-z$a]はfalseを返します。 |
-n | 文字列の長さが0でないかどうかを確認し、そうでない場合はtrueを返します。 | [-n"$a"]はtrueを返します。 |
$ | 文字列が空かどうかを確認し、空でない場合はtrueを返します。 | [$a]はtrueを返します。 |
6.ファイルテストオペレーター
ファイルテスト演算子は、Unixファイルのさまざまな属性をテストするために使用されます。
属性の検出は次のように説明されます。
オペレーター | 説明する | 例 |
---|---|---|
-bファイル | ファイルがブロックデバイスファイルであるかどうかを確認し、そうである場合はtrueを返します。 | [-b$file]はfalseを返します。 |
-cファイル | ファイルが文字デバイスファイルであるかどうかを確認し、そうである場合はtrueを返します。 | [-c$file]はfalseを返します。 |
-dファイル | 检测文件是否是目录,如果是,则返回 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: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。