# 2.2数值比较和字符串比较

### 说明：

1. 把字符串当成整型进行比较，由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换，所以用于数值比较的运算不能用于字符串比较；但是把整型当成字符串进行比较，0123这些数值完全可以转成ASCII码而且原本两个整型相等则变成ASCII码还是相等、不等的还是不等，所以可用于字符串的比较也可用于整型的比较。
2. if语句中，数值比较的写法是`if [ $var1 -ge $var2 ]`；字符串比较的写法是`if [ “$var1” != “$var2” ]`，其中加双引号只是兼容$var2处为空的情况
3. 在各种运算中，test命令的运算和中括号是等效的
4. 赋值时等号两边没空格，比较或测试时运算符两边都要有空格
5. shell默认是字符运算，如果想当数值进行运算要在前边加上expr，如：var3=`expr $var1 + $var2`
6. shell的文件包含命令只有“.”，而且该命令只能一次包含单个文件（当然可以用\*表示文件夹下所有文件）而不能包含一个文件夹；所见的!includedir和#includedir并不存在这样的命令，应该是程序自己实现的包含功能
7. “.”在shell中执行则会影响shell的环境，但如果只在脚本中执行那只影响脚本中的环境不会影响当前shell的环境；source其实也如此。

### 1.只适用于数值的比较

该类型操作会把两边变量当成**整型**进行加减运算，字符串abcd按整型运算无法进行，所以此类型不能用于字符串比较

if \[ $i -eq 10 ]

| 参数  | 说明          |
| --- | ----------- |
| -eq | 等于，返回true   |
| -ne | 不等于，返回true  |
| -gt | 大于，返回true   |
| -ge | 大于等于，返回true |
| -lt | 小于，返回true   |
| -le | 小于等于，返回true |

### 2.适用于字符串的比较（也可用于数值比较）

| 参数 | 说明         |
| -- | ---------- |
| == | 相等，返回true  |
| != | 不相等，返回true |

> 注意：==的功能在\[\[]]和\[]中的行为是不同的，如下：
>
> `[[ $a == z* ]]` # 如果$a以“z”开头（模式匹配）那么将为true
>
> `[[ $a == "z*"]]` # 如果$a等于`z*`(字符匹配)那么为true，\*为字符
>
> `[ $a == z* ]` # file flobbing和word splitting将会发生
>
> `[ "$a" == "z*" ]` # 如果$a等于z\*（字符匹配），那么为true

### 3.字符串长度运算

if \[ -z $i ]

| 参数     | 说明               |
| ------ | ---------------- |
| -z 字符串 | 字符串的长度为零，返回true  |
| -n 字符串 | 字符串的长度不为零，返回true |

### 4.文件测试运算

| 参数     | 说明                   |
| ------ | -------------------- |
| -e 文件名 | 文件存在，返回true          |
| -r 文件名 | 文件存在且可读，返回true       |
| -w 文件名 | 文件存在且可写，返回true       |
| -x 文件名 | 文件存在且可执行，返回true      |
| -s 文件名 | 文件存在且至少有一个字符，返回true  |
| -d 文件名 | 文件存在且为目录，返回true      |
| -f 文件名 | 文件存在且为普通文件，返回true    |
| -c 文件名 | 文件存在且为字符型特殊文件，返回true |
| -b 文件名 | 文件存在且为块特殊文件，返回true   |

## 参考

<https://www.cnblogs.com/mymelody/p/9436620.html>
