设为首页 收藏本站
查看: 1083|回复: 0

shell:数值运算、条件测试、if判断

[复制链接]

尚未签到

发表于 2018-8-20 07:42:27 | 显示全部楼层 |阅读模式
  bash-completion包:支持tab补齐
  数值运算:整数运算、小数运算
  一、整数运算
  1、expr
  expr A + B,A和B之间要空格,否则直接显示A+B
  expr A - B
  expr A * B          #乘法需要采用转义\,避免被作为shell通配符
  expr A / B
  \:只能屏蔽一个字符e.g:
  [root@shell ~]# a=24
  [root@shell ~]# echo \$a
  $a
  [root@shell ~]# echo $a
  24
  [root@shell ~]# echo \$a$b
  $a
  [root@shell ~]# echo \$a\$b
  $a$b
  2、$[]或$(())
  举例:
  [root@shell ~]# echo $[10*3]
  30
  [root@shell ~]# echo $[10/3]
  3
  [root@shell ~]# echo $[10+3]
  13
  [root@shell ~]# echo $[10-3]
  7
  [root@shell ~]# echo $[10%3]
  1
  [root@shell ~]# x=3
  [root@shell ~]# y=5
  [root@shell ~]# echo $[x+y]
  8
  可以一行进行多个运算
  [root@shell ~]# x=8
  [root@shell ~]# echo $[x+8],$[x*8]
  [root@shell ~]# 16,64
  3、let运算   不回显结果
  [root@shell ~]# x=9
  [root@shell ~]# let x=x+8
  [root@shell ~]# echo $x
  17
  4、特殊用法:
  i=n
  let i++ ---->i=n+1
  let i-- ---->i=n-1
  let i+=3 --->i=n+3
  let i-=2 --->i=n-2
  let i=2 --->i=n2
  let i/=2 --->i=n/2
  举例:
  [root@shell ~]# i=24
  [root@shell ~]# let i++
  [root@shell ~]# echo $i
  25
  [root@shell ~]# let i+=3
  [root@shell ~]# echo $i
  28
  [root@shell ~]# let i-=1
  [root@shell ~]# echo $i
  27
  [root@shell ~]# let i*=2
  [root@shell ~]# echo $i
  54
  [root@shell ~]# let i/=2
  [root@shell ~]# echo $i
  27
  二、小数运算
  scale=n  控制小数点位数为n位
  举例:
  [root@shell ~]# bc
  scale=5                  #取小数点后保留5位
  24/5.2555                #24除以5.2555
  4.56659                  #结果为4.56659
  bc可做数值大小比较>、=、2" | bc
  [root@shell ~]# 0
  [root@shell ~]# echo "2>1" | bc
  [root@shell ~]# 1
  [root@shell ~]# A=12.5;B=24.8
  [root@shell ~]# echo "$A>$B" | bc
  0
  bc非交互式运算
  [root@shell ~]# echo 'scale=4;12.34*56.789;5/3' | bc         #一行可以有多个命令,用分号;隔开!
  700.7762
  1.666
  三、条件测试操作
  1、字符串比较:==(判断两个字符串是否相当)、-z(字符串的值是否为空),-n(字符串的值是否不为空,相当于! -z)
  举例:
  判断当前用户是否为root
  当root用户执行时:
  [root@shell ~]# [ $USER == "root" ]
  [root@shell ~]# echo $?
  [root@shell ~]# 0
  当普通用户执行时:
  [kobe@shell ~]$ [ $USER == "root" ]
  [kobe@shell ~]$ echo $?
  [kobe@shell ~]$ 1
  且&&,或||
  一行中有多个命令,A命令和B命令
  A;B          #执行A,执行B
  A&&B         #执行A,仅当A成功才执行B
  A||B         #执行A,仅当A失败才执行B
  举例:
  [ a == a ] && echo "yes" || echo "no"
  yes
  [ a == b ] && echo "yes" || echo "no"
  no
  [root@shell ~]# [ a == a ]
  [root@shell ~]# echo $?
  [root@shell ~]# 0
  [root@shell ~]# [ -z $A ]   #判断A变量是否为空
  [root@shell ~]# echo $?     #查看0为真,非0为假
  [root@shell ~]# a="abc" ; b=""       #定义变量a的值为abc,  b的值为空,注意:""里如果有空格也算不为空
  [root@shell ~]# [ -z "$a" ] && echo "空值" || echo "非空值"
  非空值
  [root@shell ~]# [ -z $b ] && echo "空值" || echo "非空值"
  空值
  2、整数比较(不支持小数比较) -eq(等于)、-ne(不相等)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)
  举例:
  [root@shell ~]# x=20
  [root@shell ~]# [ $x -eq 20 ] && echo "相等" || echo "不相等"
  相等
  [root@shell ~]# [ $x -eq 30 ] && echo "相等" || echo "不相等"
  不相等
  提取当前登录此虚拟机的用户数,比较是否超过4
  [root@shell ~]# who | wc -l
  3                                     #统计用户数为3
  [root@shell ~]# N=$(who | wc -l)       #将统计的值赋给N
  [root@shell ~]# [ $N --gt 4 ] && echo "超过了" || echo "没超过"
  没超过
  也可简化为:
  [root@shell ~]# [ $(who | wc -l) -gt 4 ] && echo "超过了" || echo "没超过"
  3、文件、目录判断
  -e     #判断是否存在(不管是文件还是目录)
  -f     #判断是否存在文件
  -d     #判断是否存在目录
  -r     #判断是否有r权限
  -w     #判断是否有w权限
  -x     #判断是否有x权限
  举例:
  [root@shell ~]# [ -e "/usr/src" ] && echo 存在 || echo 不存在
  存在
  判断对象是否为目录 -d,是否不为目录 ! -d
  [root@shell ~]# [ -d "/usr/src/" ] && echo "是目录" || echo "不是目录"
  是目录
  [root@shell ~]# [ -d "/etc/fstab" ] && echo "是目录" || echo "不是目录"
  不是目录
  [root@shell ~]# [ -d "/home/nooby" ] && echo "是目录" || echo "不是目录"
  不是目录
  判断对象是否有-r、-w、-x权限
  注意:r和w对root用户判断无效,无论是否设置权限,root都可读或写
  举例:
  [root@shell ~]# cp install.log /tmp/t.txt          #复制一个文件做测试
  [root@shell ~]# chmod -r /tmp/t.txt                #去掉所有的r权限
  [root@shell ~]# [ -r "/tmp/t.txt" ] && echo "可读" || echo "不可读"        #root仍然可读
  可读
  切换为普通用户时:
  [kobe@shell ~]$ [ -r "/tmp/t.txt" ] && echo "可读" || echo "不可读"
  不可读
  普通用户只对自己拥有r权限的对象,-r测试才成立
  [kobe@shell ~]$ ls -l .bashrc
  -rw-r--r-- 1 kobe kobe 124 09-24 16:44 .bashrc
  [kobe@shell ~]$ [ -r ".bashrc" ] && echo "可读" || echo "不可读"
  可读
  -x权限:取决于文件本身,root或普通用户都适用
  [root@shell ~]# chmod 644 /tmp/t.txt       #设置无x权限
  [root@shell ~]# ls -l /tmp/t.txt
  -rw-r--r-- 1 root root 33139 12-11 10:52 /tmp/t.txt
  [root@shell ~]# [ -x "/tmp/t.txt" ] && echo "可执行" || echo "不可执行"
  不可执行
  [root@shell ~]# chmod +x /tmp/t.txt       #添加x权限
  [root@shell ~]# [ -x "/tmp/t.txt" ] && echo "可执行" || echo "不可执行"
  可执行
  条件组合应用:
  当前用户为root,且位于/root目录下
  [root@shell ~]# [ $USER == "root" ]&&[ $PWD == "/root"]
  [root@shell ~]# [ $? -eq 0 ]&& echo "YES"
  YES
  [root@shell ~]# [ ! -d "/xx" ]&& mkdir /xx   #判断是否没有目录/xx,是就创建
  [root@shell ~]# mount /dev/cdrom /xx         #挂载
  或
  [root@shell ~]# [ -d "/xx" ]|| mkdir /xx     #判断是否有目录/xx,没有就创建
  [root@shell ~]# mount /dev/cdrom /xx
  或
  [root@shell ~]# [  -d "/xx" ]&& mount /dev/cdrom /xx
  每分钟检测当前计算机登录的用户数量
  若数量大于2,则发送邮件报警
  先写好脚本:
  #!/bin/bash
  user=$(who | wc -l)
  [ $user -ge 2 ] && mail -s &quot;登陆用户过多&quot; root < /root/用户报警.txt
  crontab -e -u root
  /1   *  bash 脚本名
  if判断语句
  1、单分支if(仅判断对)
  if [ 判断 ];then
  命令
  fi
  if [ 判断 ];then
  成功
  else
  失败
  fi
  举例:
  脚本:
  #!/bin/bash
  read -p '请输入您的IP:' ip
  ping -c2  $ip >&/dev/null              #-c2是只ping2个包,-i0.1(缩短发送每个包的间隔时间为0.1秒),-W2(等待反馈是否ping通的超时时间2秒)
  if [ $? -eq  0 ];then
  echo 通了!
  else
  echo 不通!
  fi
  2、多分支if
  if [ 判断1 ];then
  命令
  elif [ 判断2 ];then
  命令
  ... ...
  else
  命令
  fi
  举例:
  $RANDOM(随机数)
  $[RANDOM%10+1] 求余(因为余数不可能大于除数)设定随机数的范围1-10,不能用%11,因为有可能全部除尽余数为0
  #!/bin/bash
  x=$[RANDOM%10+1]
  read -p &quot;我有个1-10的随机数,你猜:&quot; cai
  if [ $cai -eq $x ];then
  echo 恭喜你,猜对了!
  exit          #必须要有!不然猜对了还会继续猜下去
  elif [ $cai -gt $x ];then
  echo 太大了
  else
  echo 太小了
  fi
  增加概率可以从read开始到最后多复制几遍


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554019-1-1.html 上篇帖子: Linux shell编程学习实例与参数分析(二) 下篇帖子: oracle数据库shell备份脚本exp方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表