当前位置:   article > 正文

shell常用运算符-新手必看_shell逻辑运算符

shell逻辑运算符

常用shell脚本的运算符如下:

  1. 数值运算符
  2. 字符串运算符
  3. 文件运算符
  4. 逻辑运算符
  5. 网络运算符

熟练掌握以上运算符能够自如的应对日常脚本需求。本文将进行详细介绍

本文内容同微信公众号凡登】,关注不迷路,学习上高速,欢迎关注共同学习。

1、数值运算符

1.1、算术运算符

原生bash不支持简单的算术运算,可以通过 awk 和 `expr 表达式 ` 或 $(( 表达式 )) 以及 let

1.1.1、基本算术运算符

加(+)、减(-)、乘(*)、除(/)、取余(%)

  1. #!/bin/bash
  2. # 示例:expr表达式
  3. v1=`expr 2 + 2`
  4. echo "两数之和:$v1" # 两数之和:4
  5. # 示例:$(())
  6. v2=$((2 + 2))
  7. echo "两数之和:$v2" # 两数之和:4
  8. # 示例:let
  9. let v3=1+2
  10. echo "两数之和:$v3" # 两数之和:3
  11. #示例:expr表达式为乘,则需要转义
  12. v4=`expr 2 \* 2`
  13. echo "两数乘积:$v4" # 两数乘积:4

注意:

  • expr前面是是反引号(Esc下面的键),不是单引号
  • let 变量符号两侧不能有空格
  • expr表达式中*需要转义
1.1.2、基本比较运算符

大于( >) 、大于等于(>=) 、 小于(<)、 小于等于(<=)、 等于(==) 、 不等(!=)

特注:

大于( >) 、大于等于(>=) 、 小于()符号,所以只能在$(())算术运算语法结构中使用。

等于(==) 、 不等(!=) 可以使用 expr表达式、$(()) 、[ ] 运算符

示例:等于(==) 、 不等(!=)

  1. v1=`expr 6 == 6 `
  2. echo "两数相等:$v1" # 两数相等:1
  3. v2=`expr 6 != 6 `
  4. echo "两数不相等:$v2" # 两数不相等:0
  5. num=3
  6. # 使用$(()))
  7. if (( $num == 3 ))
  8. then
  9. echo "num is 3"
  10. fi
  11. # 使用[]运算符
  12. if [ $num == 3 ]
  13. then
  14. echo "结果为:true"
  15. fi

注:[] 和 $(()) 用于进行算术运算和比较操作,详情参见文章Shell 条件测试

示例:  大于( >) 、大于等于(>=) 、 小于(<)、 小于等于(<=) 

  1. num=3
  2. if (( $num <= 5 ))
  3. then echo "$num <= 5" #输出:2 <= 5
  4. else echo "error"
  5. fi
  6. # 演示错误:使用 [ ] 表示 数值大于<关系
  7. if [ $num < 5 ]
  8. then echo "$num < 5"
  9. else echo "error"
  10. fi
  11. 报错,原因:[ ] 将 < 当作输入符,
  12. op.sh: line 9: 5: No such file or directory
  13. error

问:那如果想使用 [] 表达式表示数值关系呢? 看下文 ===》1.2、关系运算符

1.2、关系运算符

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

  • -eq : 检测两个数是否相等,相等返回 true,如:[ $a -eq $b ] 返回 false
  • -ne : 检测两个数是否不相等,不相等返回 true, 如:[ $a -ne $b ] 返回 true
  • -gt : 检测左边的数是否大于右边的,如果是,则返回 true, 如:[ $a -gt $b ] 返回 false
  • -lt : 检测左边的数是否小于右边的,如果是,则返回 true, 如:[ $a -lt $b ] 返回 true
  • -ge : 检测左边的数是否大于等于右边的,如果是,则返回 true , 如:[ $a -ge $b ] 返回 false
  • -le : 检测左边的数是否小于等于右边的,如果是,则返回 true, 如:[ $a -le $b ] 返回 true
  1. num=3
  2. # 使用[]运算符 -eq 关系运算符
  3. if [ $num -eq 3 ]
  4. then
  5. echo "结果为:true"
  6. fi

2、字符串运算符

  • = : 字符串相等比较运算符,相等返回true
  • != : 字符串不相等比较运算符,不相等返回true
  • -z : 检查字符串长度是否为零,为0返回true
  • -n : 检查字符串长度是否不为零,不为0返回true
  • $ : 检查字符串是否不为空,不为空返回true
  • < : 检查第一个字符串是否按字典顺序小于第二个字符串
  • > : 检查第一个字符串是否按字典顺序大于第二个字符串
  1. # = 相等
  2. if [ "aa" = "aa" ]
  3. then
  4. echo "aa is ok"
  5. fi
  6. # != 不等
  7. if [ "Aa" != "aa" ]
  8. then
  9. echo "Aa != aa is ok"
  10. fi
  11. # 区分大小写
  12. if [ "Aa" = "aa" ]
  13. then
  14. echo "Aa = aa "
  15. else
  16. echo "Aa != aa " # 输出: Aa != aa
  17. fi
  18. # -z 检查长度是否为0
  19. str="aa"
  20. if [ -z $str ]
  21. then
  22. echo "长度为0"
  23. else
  24. echo "长度为:${#str}" # 长度为:2
  25. fi
  26. # -n 检查长度不为0
  27. str="aa"
  28. if [ -n $str ]
  29. then
  30. echo "长度不为0,长度为:${#str}" # 长度不为0,长度为:2
  31. else
  32. echo "长度为0"
  33. fi
  34. # $判断字符串是否为空
  35. name=""
  36. if [ $name ]
  37. then
  38. echo "名称不为空"
  39. else
  40. echo "名称为空:${#name}" # 名称为空:0
  41. fi
  42. name="FAN"
  43. if [ $name ]
  44. then
  45. echo "名称不为空" # 名称不为空
  46. else
  47. echo "名称为空"
  48. fi
  49. # < 检查第一个字符串是否按字典顺序小于第二个字符串
  50. if [ "abc" < "abb" ]
  51. then
  52. echo "abc 小于 abb"
  53. else
  54. echo "abc 大于 abb" # 输出: abc 大于 abb
  55. fi

3、文件运算符

  • -f file :检查文件是否存在并且是一个常规文件(既不是目录,也不是设备文件)
  • -d dir :检查目录是否存在
  • -e file_or_dir :检查文件或目录是否存在
  • -r file :检查文件是否可读
  • -w file :检查文件是否可写
  • -x file :检查文件是否可执行
  • -s file : 检测文件是否为空(文件大小是否大于0),不为空返回 true。
  1. file=/data/op.sh
  2. if [ -f $file ]
  3. then
  4. echo "普通文件"
  5. fi
  6. dir=/data
  7. if [ -d $dir ]
  8. then
  9. echo "目录存在"
  10. fi
  11. if [ -e $file ]
  12. then
  13. echo "文件或目录存在"
  14. fi
  15. if [ -r $file ]
  16. then
  17. echo "文件可读"
  18. fi
  19. if [ -w $file ]
  20. then
  21. echo "文件可写"
  22. fi
  23. if [ -x $file ]
  24. then
  25. echo "文件可执行"
  26. else
  27. echo "文件不可执行"
  28. fi
  29. # 添加执行权限之前
  30. > ls -l op.sh
  31. -rw-r--r-- 1 my my 639 10 9 20:05 op.sh
  32. > sh file.sh
  33. 输出:文件不可执行
  34. # 添加执行权限之后
  35. > chmod +x op.sh
  36. > ls -l op.sh
  37. -rwxr-xr-x 1 my my 639 10 9 20:05 op.sh
  38. > sh file.sh
  39. 输出:文件可执行
  40. # 使用ls -l命令获取文件大小
  41. file_size=$(ls -l "$file" | awk '{print $5}')
  42. if [ -s $file ]
  43. then
  44. echo "文件大小:$file_size 字节" # 文件大小:639 字节
  45. fi

4、逻辑运算符

&& 和 -a是两种不同的逻辑运算符,用于连接和执行多个命令

1、与(&&) 和 或( || )

注:推荐使用, 第一个条件执行成功后,再执行第二条,,任何一个条件失败,表达式直接返回false

  1. if [[ 1 -lt 2 && 3 -lt 4 ]]
  2. then
  3. echo "ok"
  4. fi

注:此处使用 [[表达式]]

2、与(-a)、或(-o)

注:输入非标准扩展,可能存在兼容性问题,所有条件执行完,表达式才会返回

  1. if [ 1 -lt 2 -a 3 -lt 4 ]
  2. then
  3. echo "ok"
  4. fi

3、非(!)

  1. echo "请输入一个字符串:"
  2. read s
  3. if [ ! $s = "a" ]
  4. then
  5. echo "输入的字符串不是a "
  6. else
  7. echo "输入的字符是:$s"
  8. fi
  9. #测试 输入a
  10. 请输入一个字符串:
  11. a
  12. 输入的字符是:a
  13. #测试 输入q
  14. 请输入一个字符串:
  15. q
  16. 输入的字符串不是a

5、网络运算符

ping命令检测主机的可达性

ping -c 3 host :ping指定的主机,发送3个包

  1. # 示例
  2. ping -c 3 127.0.0.1
  3. PING 127.0.0.1 (127.0.0.1): 56 data bytes
  4. 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.085 ms
  5. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.285 ms
  6. 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.235 ms
  7. --- 127.0.0.1 ping statistics ---
  8. 3 packets transmitted, 3 packets received, 0.0% packet loss

curl命令检查网站的响应

curl -s www.baidu.com :检查服务是否响应

  1. [@root ~]# curl -s www.baidu.com
  2. <!DOCTYPE html>
  3. <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8>
  4. <meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer>
  5. <link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>
  6. <body link=#0000cc>
  7. <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper>
  8. <div id=lg> <img hidefocus=true src=//www.baidu.com/img/
  9. .........

nc命令进行端口扫描

nc -zv www.baidu.com 80 : 检查服务端口是否开启

  1. [@root ~]# nc -zv www.baidu.com 80
  2. Connection to www.baidu.com port 80 [tcp/http] succeeded!

总结:工作只需要按照需要处理的对象,找到相关的运算符对号入座,注意兼容性问题,不必纠结这么多的运算符。

再次感谢您的阅读,欢迎关注微信公众号【凡登】共同学习。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/953249
推荐阅读
相关标签
  

闽ICP备14008679号