# Shell 基本運算子

• 算術運算子。

• 關係運算子。

• 布林運算子。

• 字串運算子。

• 檔案測試操作。

Bourne shell的最初並沒有任何機制來執行簡單的算術，但它使用外部程式，無論是awk或必須簡單的程式expr。

```#!/bin/sh

val=`expr 2 + 2`
echo "Total value : \$val"```

`Total value : 4`

• 運算子和表示式之間必須有空格，例如2+2是不正確的，因為它應該寫成2 + 2。

• ``，稱為倒逗號之間應包含完整的表達。

## 算術運算子：

+ Addition - Adds values on either side of the operator `expr \$a + \$b` will give 30
- Subtraction - Subtracts right hand operand from left hand operand `expr \$a - \$b` will give -10
* Multiplication - Multiplies values on either side of the operator `expr \$a * \$b` will give 200
/ Division - Divides left hand operand by right hand operand `expr \$b / \$a` will give 2
% Modulus - Divides left hand operand by right hand operand and returns remainder `expr \$b % \$a` will give 0
= Assignment - Assign right operand in left operand a=\$b would assign value of b into a
== Equality - Compares two numbers, if both are same then returns true. [ \$a == \$b ] would return false.
!= Not Equality - Compares two numbers, if both are different then returns true. [ \$a != \$b ] would return true.

## 關係運算子：

Bourne Shell的支援，關係運算子的具體數值。這些運算子不能使用字串值，除非它們的值是數位。

-eq Checks if the value of two operands are equal or not, if yes then condition becomes true. [ \$a -eq \$b ] is not true.
-ne Checks if the value of two operands are equal or not, if values are not equal then condition becomes true. [ \$a -ne \$b ] is true.
-gt Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true. [ \$a -gt \$b ] is not true.
-lt Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true. [ \$a -lt \$b ] is true.
-ge Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true. [ \$a -ge \$b ] is not true.
-le Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true. [ \$a -le \$b ] is true.

## 布林運算：

! This is logical negation. This inverts a true condition into false and vice versa. [ ! false ] is true.
-o This is logical OR. If one of the operands is true then condition would be true. [ \$a -lt 20 -o \$b -gt 100 ] is true.
-a This is logical AND. If both the operands are true then condition would be true otherwise it would be false. [ \$a -lt 20 -a \$b -gt 100 ] is false.

## 字串運算子：

= Checks if the value of two operands are equal or not, if yes then condition becomes true. [ \$a = \$b ] is not true.
!= Checks if the value of two operands are equal or not, if values are not equal then condition becomes true. [ \$a != \$b ] is true.
-z Checks if the given string operand size is zero. If it is zero length then it returns true. [ -z \$a ] is not true.
-n Checks if the given string operand size is non-zero. If it is non-zero length then it returns true. [ -z \$a ] is not false.
str Check if str is not the empty string. If it is empty then it returns false. [ \$a ] is not false.

## 檔案測試操作：

-b file Checks if file is a block special file if yes then condition becomes true. [ -b \$file ] is false.
-c file Checks if file is a character special file if yes then condition becomes true. [ -b \$file ] is false.
-d file Check if file is a directory if yes then condition becomes true. [ -d \$file ] is not true.
-f file Check if file is an ordinary file as opposed to a directory or special file if yes then condition becomes true. [ -f \$file ] is true.
-g file Checks if file has its set group ID (SGID) bit set if yes then condition becomes true. [ -g \$file ] is false.
-k file Checks if file has its sticky bit set if yes then condition becomes true. [ -k \$file ] is false.
-p file Checks if file is a named pipe if yes then condition becomes true. [ -p \$file ] is false.
-t file Checks if file descriptor is open and associated with a terminal if yes then condition becomes true. [ -t \$file ] is false.
-u file Checks if file has its set user id (SUID) bit set if yes then condition becomes true. [ -u \$file ] is false.
-r file Checks if file is readable if yes then condition becomes true. [ -r \$file ] is true.
-w file Check if file is writable if yes then condition becomes true. [ -w \$file ] is true.
-x file Check if file is execute if yes then condition becomes true. [ -x \$file ] is true.
-s file Check if file has size greater than 0 if yes then condition becomes true. [ -s \$file ] is true.
-e file Check if file exists. Is true even if file is a directory but exists. [ -e \$file ] is true.