赞
踩
常用shell脚本的运算符如下:
熟练掌握以上运算符能够自如的应对日常脚本需求。本文将进行详细介绍
本文内容同微信公众号【凡登】,关注不迷路,学习上高速,欢迎关注共同学习。
原生bash不支持简单的算术运算,可以通过 awk 和 `expr 表达式 ` 或 $(( 表达式 )) 以及 let
加(+)、减(-)、乘(*)、除(/)、取余(%)
- #!/bin/bash
- # 示例:expr表达式
- v1=`expr 2 + 2`
- echo "两数之和:$v1" # 两数之和:4
-
- # 示例:$(())
- v2=$((2 + 2))
- echo "两数之和:$v2" # 两数之和:4
-
- # 示例:let
- let v3=1+2
- echo "两数之和:$v3" # 两数之和:3
-
-
- #示例:expr表达式为乘,则需要转义
- v4=`expr 2 \* 2`
- echo "两数乘积:$v4" # 两数乘积:4
-

注意:
大于( >) 、大于等于(>=) 、 小于(<)、 小于等于(<=)、 等于(==) 、 不等(!=)
特注:
大于( >) 、大于等于(>=) 、 小于()符号,所以只能在$(())算术运算语法结构中使用。
等于(==) 、 不等(!=) 可以使用 expr表达式、$(()) 、[ ] 运算符
示例:等于(==) 、 不等(!=)
- v1=`expr 6 == 6 `
- echo "两数相等:$v1" # 两数相等:1
-
- v2=`expr 6 != 6 `
- echo "两数不相等:$v2" # 两数不相等:0
-
-
- num=3
- # 使用$(()))
- if (( $num == 3 ))
- then
- echo "num is 3"
- fi
-
- # 使用[]运算符
- if [ $num == 3 ]
- then
- echo "结果为:true"
- fi

注:[] 和 $(()) 用于进行算术运算和比较操作,详情参见文章Shell 条件测试
示例: 大于( >) 、大于等于(>=) 、 小于(<)、 小于等于(<=)
- num=3
- if (( $num <= 5 ))
- then echo "$num <= 5" #输出:2 <= 5
- else echo "error"
- fi
-
- # 演示错误:使用 [ ] 表示 数值大于<关系
- if [ $num < 5 ]
- then echo "$num < 5"
- else echo "error"
- fi
- 报错,原因:[ ] 将 < 当作输入符,
- op.sh: line 9: 5: No such file or directory
- error
问:那如果想使用 [] 表达式表示数值关系呢? 看下文 ===》1.2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
- num=3
- # 使用[]运算符 -eq 关系运算符
- if [ $num -eq 3 ]
- then
- echo "结果为:true"
- fi
- # = 相等
- if [ "aa" = "aa" ]
- then
- echo "aa is ok"
- fi
-
- # != 不等
- if [ "Aa" != "aa" ]
- then
- echo "Aa != aa is ok"
- fi
-
- # 区分大小写
- if [ "Aa" = "aa" ]
- then
- echo "Aa = aa "
- else
- echo "Aa != aa " # 输出: Aa != aa
- fi
-
- # -z 检查长度是否为0
- str="aa"
- if [ -z $str ]
- then
- echo "长度为0"
- else
- echo "长度为:${#str}" # 长度为:2
- fi
-
- # -n 检查长度不为0
- str="aa"
- if [ -n $str ]
- then
- echo "长度不为0,长度为:${#str}" # 长度不为0,长度为:2
- else
- echo "长度为0"
- fi
-
- # $判断字符串是否为空
- name=""
- if [ $name ]
- then
- echo "名称不为空"
- else
- echo "名称为空:${#name}" # 名称为空:0
- fi
-
- name="FAN"
- if [ $name ]
- then
- echo "名称不为空" # 名称不为空
- else
- echo "名称为空"
- fi
-
-
- # < 检查第一个字符串是否按字典顺序小于第二个字符串
- if [ "abc" < "abb" ]
- then
- echo "abc 小于 abb"
- else
- echo "abc 大于 abb" # 输出: abc 大于 abb
- fi

- file=/data/op.sh
- if [ -f $file ]
- then
- echo "普通文件"
- fi
-
- dir=/data
- if [ -d $dir ]
- then
- echo "目录存在"
- fi
-
- if [ -e $file ]
- then
- echo "文件或目录存在"
- fi
-
- if [ -r $file ]
- then
- echo "文件可读"
- fi
-
- if [ -w $file ]
- then
- echo "文件可写"
- fi
-
-
- if [ -x $file ]
- then
- echo "文件可执行"
- else
- echo "文件不可执行"
- fi
- # 添加执行权限之前
- > ls -l op.sh
- -rw-r--r-- 1 my my 639 10 9 20:05 op.sh
- > sh file.sh
- 输出:文件不可执行
-
- # 添加执行权限之后
- > chmod +x op.sh
- > ls -l op.sh
- -rwxr-xr-x 1 my my 639 10 9 20:05 op.sh
- > sh file.sh
- 输出:文件可执行
-
-
- # 使用ls -l命令获取文件大小
- file_size=$(ls -l "$file" | awk '{print $5}')
- if [ -s $file ]
- then
- echo "文件大小:$file_size 字节" # 文件大小:639 字节
- fi

&& 和 -a是两种不同的逻辑运算符,用于连接和执行多个命令
1、与(&&) 和 或( || )
注:推荐使用, 第一个条件执行成功后,再执行第二条,,任何一个条件失败,表达式直接返回false
- if [[ 1 -lt 2 && 3 -lt 4 ]]
- then
- echo "ok"
- fi
注:此处使用 [[表达式]]
2、与(-a)、或(-o)
注:输入非标准扩展,可能存在兼容性问题,所有条件执行完,表达式才会返回
- if [ 1 -lt 2 -a 3 -lt 4 ]
- then
- echo "ok"
- fi
3、非(!)
- echo "请输入一个字符串:"
- read s
- if [ ! $s = "a" ]
- then
- echo "输入的字符串不是a "
- else
- echo "输入的字符是:$s"
- fi
-
- #测试 输入a
- 请输入一个字符串:
- a
- 输入的字符是:a
-
- #测试 输入q
- 请输入一个字符串:
- q
- 输入的字符串不是a

ping -c 3 host :ping指定的主机,发送3个包
- # 示例
- ping -c 3 127.0.0.1
- PING 127.0.0.1 (127.0.0.1): 56 data bytes
- 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.085 ms
- 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.285 ms
- 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.235 ms
-
- --- 127.0.0.1 ping statistics ---
- 3 packets transmitted, 3 packets received, 0.0% packet loss
curl -s www.baidu.com :检查服务是否响应
- [@root ~]# curl -s www.baidu.com
- <!DOCTYPE html>
- <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8>
- <meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer>
- <link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>
- <body link=#0000cc>
- <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper>
- <div id=lg> <img hidefocus=true src=//www.baidu.com/img/
- .........
nc -zv www.baidu.com 80 : 检查服务端口是否开启
- [@root ~]# nc -zv www.baidu.com 80
- Connection to www.baidu.com port 80 [tcp/http] succeeded!
总结:工作只需要按照需要处理的对象,找到相关的运算符对号入座,注意兼容性问题,不必纠结这么多的运算符。
再次感谢您的阅读,欢迎关注微信公众号【凡登】共同学习。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。