• 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生的bash不支持简单的数学运算,但是可以通过其他命令来实现。例如常见的expr、awk。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

    一、算数运算符

    定义:a为10,b为20.
    image.png
    基本运算 ``java "2+2" //2+2 2+2 //2+2expr 2+2//2+2 格式一:expr 2 + 2` //4 bash不支持简单的数学运算,可以通过命今实现expr,但是符号两边要加空格 格式二: $[2+2] //4
  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12760058/1616068288691-43a99120-8064-4f50-b21c-3d734a5fa2d7.png#align=left&display=inline&height=133&margin=%5Bobject%20Object%5D&name=image.png&originHeight=266&originWidth=745&size=37751&status=done&style=none&width=372.5)![image.png](https://cdn.nlark.com/yuque/0/2021/png/12760058/1616068510483-bcd27771-b269-4327-91db-f9a2ab9429a6.png#align=left&display=inline&height=125&margin=%5Bobject%20Object%5D&name=image.png&originHeight=198&originWidth=515&size=21673&status=done&style=none&width=326)
  2. <a name="1QiN7"></a>
  3. # 二、关系运算符
  4. 关系运算符只支持数字,**不支持字符串**,除非字符串的值是数字。<br />> < ==
  5. ```java
  6. $[2>1] //1
  • 比较的结果为,零和非零。也就是说,相等时也是true(1)的,错误为false(0)。

    1. echo $[1==1] //1

    除了以上的,关系运算符也可以如下代替(我感觉这才是正规军)

  • -eq 检测两个数是否相等,相等返回 true。 ==

  • -ne 检测两个数是否不相等,不相等返回 true。 !=
  • -gt 检测左边的数是否大于右边的,如果是,则返回 true。 >
  • -lt 检测左边的数是否小于右边的,如果是,则返回 true。 <
  • -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 >=
  • -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 <=

    1. if [ $a -eq $b ]
    2. then
    3. echo "$a -eq $b : a 等于 b"
    4. else
    5. echo "$a -eq $b: a 不等于 b"
    6. 结果:
    7. 10 -eq 20: a 不等于 b

    三、布尔运算符

  • ! **非运算**,表达式为 true 则返回 false,否则返回 true。(可以认为是单目运算符么,吼吼吼)

    1. [ ! false ] //返回 true。
  • -o** 或运算**,有一个为true则返回true。(双目运算符,我这么认为的)

    1. [ $a -lt 20 -o $b -gt 100 ] //返回 true。
  • -a 与运算,两个都为true才返回true。(双目运算符,我还是这么认为的)

    1. [ $a -lt 20 -a $b -gt 100 ] //返回 false。

四、逻辑运算符

  • &&** 逻辑的AND**

    1. [[ $a -lt 100 && $b -gt 100 ]] //返回 false
  • || ** 逻辑的OR**

    1. [[ $a -lt 100 || $b -gt 100 ]] //返回 true

    判断代码如下: ```java 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

  1. <a name="nInR8"></a>
  2. # 五、字符串运算符
  3. 假定变量 a 为 "abc",变量 b 为 "efg":
  4. | 运算符 | 说明 | 举例 |
  5. | :--- | :--- | :--- |
  6. | = | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
  7. | != | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
  8. | -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
  9. | -n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$a" ] 返回 true。 |
  10. | $ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
  11. 用例:
  12. ```java
  13. if [ $a = $b ]
  14. then
  15. echo "$a = $b : a 等于 b"
  16. else
  17. echo "$a = $b: a 不等于 b"
  18. fi

六、文件测试运算符

文件测试运算符用于检测 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: 判断某文件是否 socket。
  • -L: 检测文件是否存在并且是一个符号链接。

用例:

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"