if shell 条件语句简写_Shell if条件判断语句用法详解

if 条件判断在语言中最为常见,主要用于判断条件是否成立,比如在课堂上,并不是所有的学员都可以进入教室,而是必须符合条件(如必须是本班级学员)才能进入教室。当然,在上课时,是通过人的大脑进行判断的;如果在程序语言中,就要通过 if 条件判断语句来判断了。

单分支 if 条件语句

单分支 if 条件语句最为简单,就是只有一个判断条件,如果符合条件则执行某个程序,否则什么事情都不做。语法如下:

if [条件判断式];then

程序

fi

在使用单分支 if 条件查询时需要注意几点:

if 语句使用 fi 结尾,和一般语言使用大括号结尾不同。

[条件判断式] 就是使用 test 命令判断,所以中括号和条件判断式之间必须有空格。

then 后面跟符合条件之后执行的程序,可以放在 [] 之后,用":"分隔;也可以换行写入,就不需要":"了,比如单分支 if 条件语句还可以这样写:

if [条件判断式]

then

程序

fi

单分支 if 条件语句非常简单,但是千万不要小看它,这是流程控制语句最基本的语法。而且在实现 Linux 管理时,我们的管理脚本一般都不复杂,单分支 if 条件语句使用的概率还是很大的。

举个例子,我想通过脚本判断根分区的使用率是否超过 80%,如果超过 80% 则向管理员报警,请他注意。 脚本就可以这样写:

[root@localhost ~]# df -h

#查看一下服务器的分区状况

文件系统 容量 已用 可用 已用% %挂载点

/dev/sda3 20G 1.8G 17G 10% /

tmpfs 306M 0 306M 0% /dev/shm

/dev/sda1 194M 26M 158M 15% /boot

/dev/srO 3.5G 3.5G 0100% /mnt/cdrom

[root@localhost ~]# vi sh/if1.sh

#!/bin/bash

#统计根分区的使用率

rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d"%"-f1)

#把根分区使用率作为变量值赋予变量rate

if [$rate -ge 80 】

#判断rate的值,如果大于等于80,则执行then程序

then

echo 'Warning! /dev/sda3 is full!!"

#打印警告信息。在实际工作中,也可以向管理员发送邮件

fi

其实这个脚本最主要的地方是"rate=$(df-h|grep "/dev/sda3"|awk'{print$5}'|cut-d"%"-f1)"这条命令,我们来分析一下这条命令:先使用"df-h"列出系统中的分区情况;然后使用"grep"命令提取出根分区行;再使用"awk"命令列出第五列,也就是根分区使用率这一列(不过使用率是 10%,不好比较,还要提取出 10 这个数字);最后使用"cut"命令(cut 命令比 awk 命令简单),以"%"作为分隔符,提取出第一列。

这条命令的执行结果如下:

[root@localhost ~]# df -h | grep "/dev/sda3" |awk'{print $5}'|cut -d"%" -f1 10

提取出根分区的使用率后,判断这个数字是否大于等于 80,如果大于等于 80 则报警。至于报警信息,我们在脚本中直接输出到屏幕上。在实际工作中,因为服务器屏幕并不是 24 小时有人值守的,所以也可以给管理员发送邮件,用于报警。

脚本写好之后,就可以利用我们在前面章节中讲到的系统定时任务,让这个脚本每天或几天执行一次,就可以实现自动检测硬盘剩余空间了。后续的系统管理的脚本,如果需要重复执行,则也需要依赖系统定时任务。

双分支条件语句

在双分支 if 条件语句中,当条件判断式成立时,则执行某个程序;当条件判断式不成立时,则执行另一个程序。

语法如下:

if [条件判断式]

then

当条件判断式成立时,执行的程序

else

当条件判断式不成立时,执行的另一个程序

fi

例如,还记得我们在进行条件测试时是怎么显示测试结果的吗?

[root@localhost ~]# [-d /root/sh] && echo "yes" || echo "no"

#第一条判断命令如果正确执行,则打印"yes"; 否则打印"no"

yes

这样显示条件测试的结果还是非常不方便的。当时是因为我们还没有讲 if 语句,所以只能用逻辑与和逻辑或来显示测试结果。既然我们已经学习了 if 语句,就把这个条件测试改写为 if 语句吧。

#!/bin/bash

#判断输入的文件是否是一个目录

read -t 30 -p "Please input a directory:" dir #read接受键盘的输入,并存入dir变量

if[-d $dir]

#测试$dir中的内容是否是一个目录

then

echo "yes"

#如果是一个目录,则输出yes

else

echo "no"

#如果不是一个目录,则输出no

fi

解释一下这个脚本的思路:其实逻辑与和逻辑或也是在判断前一条命令的"$?"的返回值是不是 0,如果是 0,则前一条命令正确执行;如果不是 0,则证明前一条命令执行错误。双分支if条件语句的判断思路也是测试条件判断式是否成立,如果成立,则执行"then"中的命令;如果不成立,则执行"else"中的命令。

多分支 if 条件语句

在多分支 if 条件语句中,允许执行多次判断。也就是当条件判断式 1 成立时,执行程序 1;当条件判断式 2 成立时,执行程序 2;依次类推,当所有条件不成立时,执行最后的程序。语法如下:

if[条件判断式1]

then

当条件判断式1成立时,执行程序1

elif [条件判断式2]

then

当条件判断式2成立时,执行程序2

…省略更多条件...

else

当所有条件都不成立时,最后执行此程序、

fi

例如,用多分支 if 条件语句来判断用户输入的是一个个文件还是一个目录。

[root@localhost ~]#vi sh/if-elif.sh

#!/bin/bash

#判断用户输入的是什么文件

read -p "Please input a filename:" file

#接收键盘的输入,并赋予变量file

if[-z "$file"]

#判断file变量是否为空

then

echo "Error,please input a filename"

#如果为空,则执行程序1,也就是输出报错信息、

exit 1

#退出程序,并定义返回值为1 (把返回值赋予变量$?)

elif[!-e "$file"]

#判断file的值是否存在

then

echo 'Your input is not a file!"

#如果不存在,则执行程序2

exit 2

#退出程序,并定义返回值为2

elif[-f "$file"]

#判断file的值是否为普通文件

then

echo "$file is a regulare file!"

#如果是普通文件,则执行程序3

elif[-d"$file"]

#判断file的值是否为目录文件

then

echo "$file is a directory!"

#如果是目录文件,则执行程序4

else

echo is an other file!"

#如果以上判断都不是,则执行程序5

fi

解释一下脚本思路:这个脚本比较简单,需要说明的是 exit 这条命令。这条命令是退出执行程序的命令,如果符合条件 1(没有输入)和条件 2(输入的不是文件),则需要执行 exit 命令;否则程序还是会运行一下脚本的,这不符合我们的要求。至于 exit 后面的返回值,是自由定义的,主要用于把返回值赋予变量 $?。我们执行一下这个脚本:

[root@localhost ~]# chmod 755 sh/if-elif.sh

#赋予执行权限

[root@localhost ~]# sh/if-elif.sh

#执行脚本

Please input a filename:

#没有任何输入

Error,please input a filename

#报错信息是脚本中自己定义的

[root@localhost ~]# echo $?

1

#变量$?的返回值是我们自己定义的1

[root@localhost ~]# sh/if-elif.sh

Please input a filename: jkgeia

#随便输入不是文件的字符串

Your input is not a file!

#报错信息是自己定义的

[root@localhost ~]# echo $?

2

#变量$?的返回值是我们自己定义的2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十节:基于MVC5+Unity+EF+Log4Net的基础结构搭建

一. 前言 从本节开始,将陆续的介绍几种框架搭建组合形式,分析每种搭建形式的优势和弊端,剖析搭建过程中涉及到的一些思想和技巧。 (一). 技术选型 1. DotNet框架:4.6 2. 数据库访问:EF 6.2 (CodeFrist模式) 3. IOC框架…

a*算法的优缺点_K-近邻算法以及案例

什么是K-近邻算法(KNN)根据邻居判断类型。如果一个样本在特征空间中有K个最相似(距离相近)的样本大多数属于一个类别,则该样品也属于这个类别。如何求距离呢?非常简单,如图。a1,a2,a3代表样本a的特征值 b1,b2,b3代表b的样本值,根…

android 预约挂号代码_告别排队!用Python定时自动挂号和快捷查询化验报告

作者 | 阿文来源 | 程序人生(ID: coder_life)我什么要做这个事情去年单位体检查出问题来,经过穿刺手术确诊是个慢性肾脏病2期, IGA 肾病三期,可能大家对于这个病并不是很了解,但是另外一个词可能大家都听过,叫"尿…

灵动思绪EF(Entity FrameWork)

很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的EF知识整理成一片文章。今天我就用CodeFirst和ModelFirst两种方式的简单案例将自己学习的EF知识做个总结。 在讲解EF之前,我们先来看下ORM ORM全称:(Object-Relatio…

json qbytearray 串 转_JSON数据采集网关,json转Modbus RTU串IO口RS485转4~20mA边缘计算智能终端...

JSON数据采集网关边缘计算智能终端是一种能够将各种传感器仪表仪器设备的数据采集后按照JSON格式上传服务器的网关,可以实现云边协同。JSON(JavaScript Object Notation)是java中的数据格式。例如{“Energy”:”100”, “time”:”22:22:15”}这样的格式&#xff0c…

ABP入门系列(3)——领域层定义仓储并实现

一、先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。 在ABP中,仓储类要实现IRepository接口,接口定义了常用的增删改查以及…

java自适应table_Java 设置Word中的表格自适应的3种方式

概述在Word创建表格时,可设置表格“自动调整”,有3种情况,通过Java程序设置可调用相应的方法来实现,即:根据内容调整表格AutoFitBehaviorType.Auto_Fit_To_Contents根据窗口调整表格AutoFitBehaviorType.Auto_Fit_To_W…

ABP入门系列(4)——创建应用服务

ABP入门系列目录——学习Abp框架之实操演练 1. 解释下应用服务层 应用服务用于将领域(业务)逻辑暴露给展现层。展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行相应的业务逻辑并且将DTO返回给展现层。因此,展现层和领…

sw槽钢插件_SolidWorks所有实用插件详解一览

1.3D Instant Website 是一套全新的工具, 能使 Solidworks 的使用者快速且方便的创造、发表一个生动又有安全性的 3D交互式的网页。利用 3D Instant Website将现有的3D实体模型利用网页格式发表在 Solidworks 提供的网站或是公司内部的网站上3D Instant…

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路 首先来个测试 给你们选,答案选啥呢? 正确答案在结尾公布 正确答案是C 为什么呢? 首先,虽然ACL有一个齐总是拒绝的,但是呢,他两都是同一条路由 但是呢!&#x…

ABP入门系列(5)——展现层实现增删改查

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 这一章节将通过完善Controller、View、ViewModel,来实现展现层的增删改查。最终实现效果如下图: 展现层最终效果 一、定义Controller ABP对ASP.NET MVC Controlle…

限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我

高并发分布式开发技术体系已然非常的庞大,从国内互联网企业使用情况,可发现RPC、Dubbo、ZK是最基础的技能要求。关于Zookeeper你是不是还停留在Dubbo注册中心的印象中呢?还有它的工作原理呢?经典应用场景呢?对前面三个…

防抖与节流方案_前端ajax优化解决方案

伴随着前端ajax的应用场景越来越多,那就免不了一个整合的ajax优化解决方案了,自己优化太麻烦?没事,有它帮你解决:hajax 与当下比较热门的请求库 axios 和原生的 fetch相比,hajax有什么一些什么内容和特点呢…

ABP入门系列(6)——定义导航菜单

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了增删改查以及页面展示,这一节我们来为任务清单添加【导航菜单】。 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这…

ABP入门系列(7)——分页实现

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊。 来来来,这一节咱们就来捋一捋如…

下载matlab安装包太慢_Matlab2017a软件安装包以及安装教程

安装步骤:1.如图所示,完整的安装包应该有13个压缩包,必须要全部下载完成才能解压。鼠标右击“thMWoMaR17a.part01.rar”压缩包,选择“解压到thMWoMaR17a”,然后等待解压完成2.打开“thMWoMaR17a”文件夹,解…

【转】ORM系列之Entity FrameWork详解

一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是【SQL语句ADO.NET】,那时候,什么存储过程、什么事务 统统不理解,生硬的将SQL语句传入SQL…

springcloud 微服务鉴权_Java微服务框架spring cloud

Spring Cloud是什么Spring Boot 让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,…

ABP入门系列(8)——Json格式化

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 讲完了分页功能,这一节我们先不急着实现新的功能。来简要介绍下Abp中Json的用法。为什么要在这一节讲呢?当然是做铺垫啊,后面的系列文章会经常和Json这个…