<commit_before># Shell运算符：Shell算数运算符、关系运算符、布尔运算符、字符串运算符等

- `Bash`支持的运算符
  - 算数运算符、
  - 关系运算符、
  - 布尔运算符、
  - 字符串运算符
  - 文件测试运算符


## 算数运算符

- 原生`bash`**不支持简单的数学运算**，但是可以通过其他命令来实现  
   - *例如* `awk` 和 `expr`，`expr` 最常用


```bash
#!/bin/bash
val=`expr 2 + 2`
echo "Total value : $val"
```   

> **Notes**  
> - 表达式和运算符之间**要有空格**，例如 `2+2` 是不对的，必须写成 `2 + 2`，*这与我们熟悉的大多数编程语言不一样*
> - 完整的表达式要被 反引号（`） 包含

## 算术运算符

- [算术运算符例子](../Shell.Demo/arithmetic.demo.sh)

- 算术运算符列表

| 运算符 |	说明 |	举例  | 
|:------|:-----|:--------|
| + |	加法 |	`expr $a + $b` 结果为 30。|
| -	| 减法 |	`expr $a - $b` 结果为 10。 |
| *	| 乘法 |	`expr $a \* $b` 结果为  200。 |
| /	| 除法 |	`expr $b / $a` 结果为 2。 |
| %	| 取余 |	`expr $b % $a` 结果为 0。 |
| = |	赋值 |	a=$b 将把变量 `b` 的值赋给 `a`。 |
| == |	相等。用于比较两个数字，相同则返回 `true`。	| `[ $a == $b ]` 返回 `false`。 |
| != |	不相等。用于比较两个数字，不相同则返回 `true`。|  	`[ $a != $b ]` 返回 `true`。 |

> **Notes**  
> - **条件表达式**要放在`方括号`之间，并且要有`空格`
>    - 例如 `[$a==$b]` 是*错误*的，必须写成 `[ $a == $b ]`  
> - 乘号(`*`)前边必须加反斜杠(`\`)才能实现乘法运算

## 关系运算符

- 关系运算符**只支持数字**，**不支持字符串**，*除非字符串的值是数字*

- [关系运算符脚本](../Shell.Demo/relational.operator.demo.sh)

- 关系运算符列表

| 运算符 |英文|	说明 |	举例 |
|:-------|:---|:-----|:-------|
| -eq | equal |	检测两个数**是否相等**，*相等返回 `true`*。 |	`[ $a -eq $b ]` 返回 `true`。 |
| -ne | not equal|	检测两个数**是否相等**，*不相等返回 `true`*。 |	`[ $a -ne $b ]` 返回 `true`。 |
| -gt | greater than	| 检测左边的数**是否大于右边的**，如果是，则返回 `true`。 |	`[ $a -gt $b ]` 返回 `false`。 |
| -lt | less than	| 检测左边的数**是否小于右边的**，如果是，则返回 `true`。 |	`[ $a -lt $b ]` 返回 `true`。 |
| -ge | greater equal |	检测左边的数**是否大等于右边的**，如果是，则返回 `true`。 |	`[ $a -ge $b ]` 返回 `false`。 |
| -le |less equal |	检测左边的数**是否小于等于右边的**，如果是，则返回 `true`。 |	`[ $a -le $b ]` 返回 `true`。 |


> **说明**    
> a=10  
> b=20

## 布尔运算符

- [布尔运算符例子](../Shell.demo/bool.operator.sh)

- 布尔运算符列表

| 运算符 |	说明 |	举例 |
|:------|:-----|:-------|
| ! |	`非运算`，表达式为 `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。 |

## 字符串运算符

- [字符串运算符例子](../Shell.Demo/string.operator.sh)

- 字符串运算符列表

| 运算符 |	说明 |	举例 |
|:------|:-----|:-------
| = |	检测两个字符串是否相等，**相等返回 `true`**。	| `[ $a = $b ]` 返回 `false`。 |
| != |	检测两个字符串是否相等，**不相等返回 `true`**。 |	`[ $a != $b ]` 返回 `true`。 |
| -z |	检测字符串长度是否为`0`，**为`0`返回 `true`**。 |	`[ -z $a ]` 返回 `false`。 |
| -n |	检测字符串长度是否为`0`，**不为`0`返回 `true`**。 |	`[ -z $a ]` 返回 `true`。 |
| str |	检测字符串是否为空，**不为空返回 `true`**。| 	`[ $a ]` 返回 `true`。 |

> **Notes**  
> a="abc"  
> b="efg"  

## 文件测试运算符

- 文件测试运算符用于检测 `Unix` 文件的各种属性<commit_msg>更正bool运算符的例子链接<commit_after># Shell运算符：Shell算数运算符、关系运算符、布尔运算符、字符串运算符等

- `Bash`支持的运算符
  - 算数运算符、
  - 关系运算符、
  - 布尔运算符、
  - 字符串运算符
  - 文件测试运算符


## 算数运算符

- 原生`bash`**不支持简单的数学运算**，但是可以通过其他命令来实现  
   - *例如* `awk` 和 `expr`，`expr` 最常用


```bash
#!/bin/bash
val=`expr 2 + 2`
echo "Total value : $val"
```   

> **Notes**  
> - 表达式和运算符之间**要有空格**，例如 `2+2` 是不对的，必须写成 `2 + 2`，*这与我们熟悉的大多数编程语言不一样*
> - 完整的表达式要被 反引号（`） 包含

## 算术运算符

- [算术运算符例子](../Shell.Demo/arithmetic.demo.sh)

- 算术运算符列表

| 运算符 |	说明 |	举例  | 
|:------|:-----|:--------|
| + |	加法 |	`expr $a + $b` 结果为 30。|
| -	| 减法 |	`expr $a - $b` 结果为 10。 |
| *	| 乘法 |	`expr $a \* $b` 结果为  200。 |
| /	| 除法 |	`expr $b / $a` 结果为 2。 |
| %	| 取余 |	`expr $b % $a` 结果为 0。 |
| = |	赋值 |	a=$b 将把变量 `b` 的值赋给 `a`。 |
| == |	相等。用于比较两个数字，相同则返回 `true`。	| `[ $a == $b ]` 返回 `false`。 |
| != |	不相等。用于比较两个数字，不相同则返回 `true`。|  	`[ $a != $b ]` 返回 `true`。 |

> **Notes**  
> - **条件表达式**要放在`方括号`之间，并且要有`空格`
>    - 例如 `[$a==$b]` 是*错误*的，必须写成 `[ $a == $b ]`  
> - 乘号(`*`)前边必须加反斜杠('\')才能实现乘法运算

## 关系运算符

- 关系运算符**只支持数字**，**不支持字符串**，*除非字符串的值是数字*

- [关系运算符脚本](../Shell.Demo/relational.operator.demo.sh)

- 关系运算符列表

| 运算符 |英文|	说明 |	举例 |
|:-------|:---|:-----|:-------|
| -eq | equal |	检测两个数**是否相等**，*相等返回 `true`*。 |	`[ $a -eq $b ]` 返回 `true`。 |
| -ne | not equal|	检测两个数**是否相等**，*不相等返回 `true`*。 |	`[ $a -ne $b ]` 返回 `true`。 |
| -gt | greater than	| 检测左边的数**是否大于右边的**，如果是，则返回 `true`。 |	`[ $a -gt $b ]` 返回 `false`。 |
| -lt | less than	| 检测左边的数**是否小于右边的**，如果是，则返回 `true`。 |	`[ $a -lt $b ]` 返回 `true`。 |
| -ge | greater equal |	检测左边的数**是否大等于右边的**，如果是，则返回 `true`。 |	`[ $a -ge $b ]` 返回 `false`。 |
| -le |less equal |	检测左边的数**是否小于等于右边的**，如果是，则返回 `true`。 |	`[ $a -le $b ]` 返回 `true`。 |


> **说明**    
> a=10  
> b=20

## 布尔运算符

- [布尔运算符例子](../Shell.Demo/bool.operator.sh)

- 布尔运算符列表

| 运算符 |	说明 |	举例 |
|:------|:-----|:-------|
| ! |	`非运算`，表达式为 `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。 |

## 字符串运算符

- [字符串运算符例子](../Shell.Demo/string.operator.sh)

- 字符串运算符列表

| 运算符 |	说明 |	举例 |
|:------|:-----|:-------
| = |	检测两个字符串是否相等，**相等返回 `true`**。	| `[ $a = $b ]` 返回 `false`。 |
| != |	检测两个字符串是否相等，**不相等返回 `true`**。 |	`[ $a != $b ]` 返回 `true`。 |
| -z |	检测字符串长度是否为`0`，**为`0`返回 `true`**。 |	`[ -z $a ]` 返回 `false`。 |
| -n |	检测字符串长度是否为`0`，**不为`0`返回 `true`**。 |	`[ -z $a ]` 返回 `true`。 |
| str |	检测字符串是否为空，**不为空返回 `true`**。| 	`[ $a ]` 返回 `true`。 |

> **Notes**  
> a="abc"  
> b="efg"  

## 文件测试运算符

- 文件测试运算符用于检测 `Unix` 文件的各种属性
{'fraction_non_alphanumeric': 0.31140266255064636, 'fraction_numerical': 0.012733937873818251, 'mean_word_length': 2.710808876163207, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2763294', 'n_tokens_mistral': 3657, 'n_tokens_neox': 4010, 'n_words': 503}