Shell 支持多种运算符(算数、关系、布尔、字符串、文件测试等),不过Bash不支持简单的数学运算,但是可以通过其他命令来实现,如:exprawk

1. 算数运算符

1.1 linux expr命令

expr命令是一个手工命令行计算器,用于在Unix/Linux下求表达式变量的值,一般用于整数值,也可以用于字符串
使用方法: expr 表达式
说明:

  • 空格 隔开每个项
  • 用反斜杠 \ 放在Shell特定的字符前面
  • 对包含空格和其他特殊字符的字符串要用引号括起来

实例:

  1. # 计算字符串长度
  2. expr length "this is a test" # 14
  3. # 截取字符串
  4. expr substr "this is a test" 3 5 # is is
  5. # 检索第一个字符出现的位置
  6. expr index "this is a test" h # 1
  7. #整数运算
  8. expr 10 + 10 # 20,数学计算结果
  9. expr 10+10 # 10+10 字符串结果,很可能不符合预期
  10. expr 14 % 9 # 5
  11. expr 30 / 3 / 2 # 5
  12. expr 30 \* 3 # 90 # 使用乘号*时,必须用反斜线屏蔽其特定含义,避免Shell误解*含义
  13. expr 30 * 3 # Syntax error
  14. a=10
  15. b=`expr 10 + 10` # 表达式计算需要放到反引号``内
  16. `expr $a + $b` # 30
  17. `expr $a - $b` # -10
  18. `expr $a \* $b` # 200
  19. `expr $b / $a` # 2
  20. `expr $b % 6` # 2
  21. c=$b # 把变量b赋值给c

2. 关系运算符

关系运算符只支持数字运算,不支持字符串运算(除非字符串的值是数字)

  1. #!/bin/bash
  2. # author:yonglong.wyl
  3. # data:2021/06/03
  4. # 通过终端入口传入
  5. a=$1
  6. b=$2
  7. # == 数值相等运算符,等效 -eq
  8. if [ $a == $b ]
  9. then
  10. echo "$a == $b"
  11. fi
  12. # != 数值不相等运算符,等效 -ne
  13. if [ $a != $b ]
  14. then
  15. echo "$a != $b"
  16. fi
  17. # -eq 数值相等运算符,等效 ==
  18. if [ $a -eq $b ]
  19. then
  20. echo "$a -eq $b"
  21. fi
  22. # -ne 数值不等效运算符,等效 !=
  23. if [ $a -ne $b ]
  24. then
  25. echo "$a -ne $b"
  26. fi
  27. # -gt 数值大于运算符,形象类似:>
  28. if [ $a -gt $b ]
  29. then
  30. echo "$a -gt $b"
  31. fi
  32. # -lt 数值小于运算符,形象类似:<
  33. if [ $a -lt $b ]
  34. then
  35. echo "$a -lt $b"
  36. fi
  37. # -ge 数值大于等于运算符,形象类似:>=
  38. if [ $a -ge $b ]
  39. then
  40. echo "$a -ge $b"
  41. fi
  42. # -le 数值小于等于运算符,形象类似:<=
  43. if [ $a -le $b ]
  44. then
  45. echo "$a -le $b"
  46. fi

3. 布尔运算符

  1. #!/bin/bash
  2. # author: yonglong.wyl
  3. # data: 2021/06/03
  4. a=10
  5. b=20
  6. # ! 非运算,表达式的值取反
  7. if [ $a != $b ]
  8. then
  9. echo "$a != $b : a 不等于b"
  10. fi
  11. # -a 与运算,两个表达式都为true才返回true
  12. if [ $a -lt 100 -a $b -gt 15 ]
  13. then
  14. echo "$a 小于 100 且 $b 大于 15:返回 true"
  15. else
  16. echo "$a 小于 100 且 $b 大于 15:返回 false"
  17. fi
  18. # -o 或运算,有一个表达式为true则返回true
  19. if [ $a -lt 100 -o $b -gt 100 ]
  20. then
  21. echo "$a 小于100 或 $b 大于 100:返回 true"
  22. else
  23. echo "$a 小于100 或 $b 大于100: 返回 false"
  24. fi
  25. ~

逻辑运算符

  1. #!/bin/bash
  2. # author: yonglong.wyl
  3. # data: 2021/06/03
  4. a=10
  5. b=20
  6. # && 逻辑AND,同时为true才返回true
  7. if [[ $a -lt 100 && $b -gt 100 ]] #注意逻辑操作运算:两个[]嵌套
  8. then
  9. echo "返回 true"
  10. else
  11. echo "返回 false"
  12. fi
  13. # || 逻辑OR,只要有一个为true,则返回true
  14. if [[ $a -lt 100 || $b -gt 100 ]]
  15. then
  16. echo "返回 true"
  17. else
  18. echo "返回 false"
  19. fi

字符运算符

  1. #!/bin/bash
  2. # author: yonglong.wyl
  3. # data: 2021/06/03
  4. a="abc"
  5. b="efg"
  6. # [ = ] 检测两个字符串是否相等,相等返回 true,注意:一个等号= + [] 组成
  7. if [ $a = $b ]
  8. then
  9. echo "$a = $b: a 等于 b"
  10. else
  11. echo "$a = $b: a 不等于 b"
  12. fi
  13. # [ != ] 检测两个字符串是否不相等,不相等返回 true
  14. if [ $a != $b ]
  15. then
  16. echo "$a != $b : a 不等于 b"
  17. else
  18. echo "$a != $b : a 等于 b"
  19. fi
  20. # [ -z ] 检测字符串长度是否为0,为0返回 true
  21. if [ -z $a ]
  22. then
  23. echo "-z $a : 字符串长度为 0"
  24. else
  25. echo "-z $a : 字符串长度不为 0"
  26. fi
  27. # [ -n ] 检测字符串长度是否不为0,不为0则返回 true
  28. if [ -n $a ]
  29. then
  30. echo "-n $a : 字符串长度不为 0"
  31. else
  32. echo "-n $a : 字符串长度为 0"
  33. fi
  34. # [ $ ] 直接引用变量,检测变量是否为空,不为空返回 true
  35. if [ $a ]
  36. then
  37. echo "$a : 字符串不为空"
  38. else
  39. echo "$a : 字符串为空"
  40. fi

文件测试运算符

  1. #!/bin/bash
  2. # author: yonglong.wyl
  3. # data: 2021/06/03
  4. file="/Users/yonglong.wyl/Works/trip/ex-shell/ex7_file_operator.sh"
  5. # -r 文件是否可读
  6. if [ -r $file ]
  7. then
  8. echo "文件可读"
  9. else
  10. echo "文件不可读"
  11. fi
  12. # -w 文件是否可写
  13. if [ -w $file ]
  14. then
  15. echo "文件可写"
  16. else
  17. echo "文件不可写"
  18. fi
  19. # -x 文件是否可运行
  20. if [ -x $file ]
  21. then
  22. echo "文件可执行"
  23. else
  24. echo "文件不可执行"
  25. fi
  26. # -f 文件是否为普通文件,非目录,非设备文件
  27. if [ -f $file ]
  28. then
  29. echo "文件为普通文件"
  30. else
  31. echo "文件为特殊文件"
  32. fi
  33. # -d 是否是目录,目录则返回 true
  34. if [ -d $file ]
  35. then
  36. echo "文件是个目录"
  37. else
  38. echo "文件不是目录"
  39. fi
  40. # -s 文件是否为空,文件大小是否大于0,存在返回 true
  41. if [ -s $file ]
  42. then
  43. echo "文件不为空"
  44. else
  45. echo "文件为空"
  46. fi
  47. # -e 检测文件包括目录是否存在,存在返回 true
  48. if [ -e $file ]
  49. then
  50. echo "文件/目录 存在"
  51. else
  52. echo "文件/目录 不存在"
  53. fi