(027) Linux之shell分支if语句

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


 

一、使用if语句

通过shell,我们可以来写出这样的一个使用if语句的shell脚本片段。如下所示:

#!/bin/bash
# test "if" statementx=5if [ $x = 5 ]; thenecho "x equals 5"
elseecho "x doesn't equals 5"
fi

      或者可以直接在命令行中输入以上代码(略有简化),如下图所示:

      if语句的语法格式如下:

if commands; thencommands
[elif commands; thencommands]
[elsecommands]
if

      在这个语法格式中,“command”可以是一组命令。乍看上去可能会有些迷惑。在去除这个迷惑之前,我们必须要先了解一下shell如何判断一个命令的成功与失败。

 

二、退出状态

  命令(包括我们编写的shell脚本和shell函数)在执行完毕后,会向操作系统发送一个值,称之为“退出状态”。这个值是一个0~255的整数,用来指示命令执行成功还是失败。按照惯例,数值0表示执行成功,其他的数值表示执行失败。shell提供了一个可以用来检测退出状态的参数。这个参数就是$?。如下图所示:

  在这个例子中,我们两次执行了ls命令。第一次,命令执行成功,如果显示参数“$?”的值,可以看到值是0.第二次执行ls命令时,产生了一个错误,再次显示“$?”的值,这次值是2,表示这个命令遇到了一个错误。有些命令使用不同的退出值来诊断错误,而需要命令执行失败时,只是简单地退出并发送数字1.man手册中经常会包括一个标题为“Exit Status”的段落,它描述使用的代码。数字0总是表示执行成功。

  shell提供了2个非常简单的内置命令,它们不做任何事情,除了以一个0或1退出状态来终止执行。“true”命令总是表示执行成功,而“false”命令总是表示执行失败。如下图所示:

  我们可以用这两个命令来查看if语句是如何工作的。if语句真正做的事情是评估命令的成功或失败。

  当在if后面的命令执行成功时,命令echo "it's true."会被执行,而当在if后面的命令执行失败时,该命令则不执行。如果在if后面有一系列的命令,那么则根据最后一个命令的执行结果来进行评估。如下图所示:

 

三、使用test命令

  目前为止,经常和if一起使用的命令是test。test命令会执行各种检查和比较。这个命令有两种等价的形式:

  test expression

  以及更加流行的

  [ expression ]

  这里的expression是一个表达式,其结果是true或false。当这个表达式为true时,test命令会返回一个0退出状态;当表达式为false时,test命令的退出状态为1。

  1. 文件表达式(expression)

  下表中的表达式展示的是有关文件的表达式。这些文件表达式用来评估文件的状态。

文件表达式成为true的条件
file1 -ef file2file1和file2拥有相同的信息节点编号(这两个文件通过硬链接指向同一个文件)
file1 -nt file2file1比file2新
file1 -ot file2file1比file2旧
-b filefile存在并且是一个块(设备)文件
-c filefile存在并且是一个字符(设备)文件
-d filefile存在并且是一个目录
-e filefile存在
-f filefile存在并且是一个普通文件
-g filefile存在并且设置了组ID
-G filefile存在并且属于有效组ID
-k filefile存在并且有“粘滞位(sticky bit)属性”
-L filefile存在并且是一个符号链接
-O filefile存在并且属于有效用户ID
-p filefile存在并且是一个命名管道
-r filefile存在并且可读(有效用户有可读权限)
-s filefile存在并且其长度大于0
-S filefile存在并且是一个网络套接字
-t fdfd是一个定向到终端/从终端定向的文件描述符,可以用来确定标准输入/输出/错误是否被重定向
-u filefile存在并且设置了setuid位
-w filefile存在并且可写(有效用户拥有可写权限)
-x filefile存在并且可执行(有效用户拥有执行/搜索权限)

  下面代码展示了一个使用文件表达式的例子:

#!/bin/bash# test-file: Evaluate the status of a fileFILE=~/.bashrcif [ -e "$FILE" ]; thenif [ -f "$FILE" ]; thenecho "$FILE is a regular file."fi  if [ -d "$FILE" ]; thenecho "$FILE is a directory."fi  if [ -r "$FILE" ]; thenecho "$FILE is readable."fi  if [ -w "$FILE" ]; thenecho "$FILE is writable."fi  if [ -x "$FILE" ]; thenecho "$FILE is executable/searchable."fi  
elseecho "$FILE does not exist"exit 1
fiexit

  关于上面的脚本,需要注意两个有趣的地方。首先,要注意$FILE在表达式内是如何被引用的。尽管引号不是必需的,但是这可以防范参数为空的情况。如果$FILE的参数扩展产生一个空值,将导致一个错误(操作符会被解释为非空的字符串,而不是操作符)。用引号把参数括起来可以确保操作符后面总是跟随一个字符串,即使字符串为空。其次,注意脚本末尾的exit命令。这个exit命令接受一个单独的可选参数,它将称为脚本的退出状态。当不传递参数时,退出状态默认为0。以这种方法使用exit命令,当$FILE扩展为一个不存在的文件名时,可以允许脚本提示失败。这个exit命令出现在脚本的最后一行。这样,当脚本执行到最后时,不管怎么样,默认情况下它将以退出状态0终止。

  类似地,通过在return命令中包含一个整数参数,shell函数可以返回一个退出状态。如果要将上面的脚本转换为一个shell函数,从而能够在一个更大的程序中使用,可以将exit命令替换为return命令,并得到想要的行为。

 

四、字符串表达式

  下列表达式用来测试字符串的操作。

表达式称为true的条件
stringstring不为空
-n stringstring的长度大于0
-z stringstring的长度等于0

string1 = string2

string1 == string2

string1和string2相等。单等号和双等号都可以使用,但是双等号使用的更多。要注意在使用等号和不等于号的时候,需要操作符两边加空格。否则执行结果不是你想象
string1 > string2在排序时,string1在string2之后
string1 < string2在排序时,string1在string2之前
string1 != string2string1和string2不相等

  警告:在使用test命令时,“>”和“<”运算符必须用引号括起来(或者是使用反斜杠来进行转义)。如果不这么做,就会被shell解释为重定向操作符,从而造成潜在的破坏性结果。同时注意,尽管bash文档中已经有过声明,排序遵从当前语系的排列规则,但并非如此。在bash 4.0版本以前(包括4.0版本),使用的是ASCII(POSIX)排序方式。

 

五、整数表达式

  下表中的表达式可以用于整数。

表达式成为true的条件
integer1 -eq integer2integer1和integer2相等
integer1 -ne integer2integer1和integer2不相等
integer1 -le integer2integer1小于等于integer2
integer1 -lt integer2integer1小于integer2
integer -gt integer2integer1大于integer2
integer1 -ge integer2integer1大于等于integer2

 

六、更现代的test指令

  bash提供了复合命令(()),而不是[](test指令)用来操作整数。该命令支持一套完整的算术计算。

  复合指令(())用于执行算术真值测试(arithmetic truth test)。当算术计算的结果是非0值时,则算术真值测试为true。

      以下是一个使用(())复合命令来测试算术结果的样例脚本,注意这里使用了小于号、等于号和大于号来测试相等性。在处理整数的时候,这些语法看起来更加的自然。此外,由于(())复合命令只是shell语法的一部分,而非普通的命令,并且只能处理整数。

#!/bin/bash# compound command (()) for arithmetic computingINT=7if [ -z "$INT" ]; thenecho "INT is empty." >&2exit 1
elif (( $INT == 0 )); thenecho "INT equals zero."
elif (( $INT < 0 )); thenecho "INT less than zero."
elif (( $INT > 0)); thenecho "INT greater than zero."
fiif (( $INT % 2 == 0)); thenecho "INT is even."
elseecho "INT is odd."
fi

 

七、组合表达式

  我们也可以将表达式组合起来,来创建更复杂的计算。表达式是使用逻辑运算符组合起来的。与test命令配套的逻辑运算符有三个,它们是and, or和not。下表展示了逻辑操作符。

Operationtest(())
AND-a&&
OR-o||
NOT!!

 

八、控制运算符:另一种方式的分支

  bash还提供了两种可以执行分支的控制运算符。“&&”和“||”运算符与上述复合命令中的逻辑运算符类似,语法如下:

  command1 && command2 和 command1 || command2

  理解这两个运算符是非常重要的。对于“&&”运算符来说,先执行command1,只有在command1执行成功时,command2才能够执行。对于“||”运算符来说,先执行command1,则只有command1执行失败的时候,command2才能够执行。

      从实用性考虑,这意味着可以这样做:

mkdir test && cd test

  这会创建一个temp目录,并且当这个创建工作执行成功后,当前的工作目录才会更改为temp。只有在第一个mkdir命令执行成功后,才会尝试执行第二个命令。同样,看如下命令:

[ -d temp ] || mkdir temp

  这个命令先检测temp目录是否存在,只有当检测失败时,才会创建这个目录。

 

转载于:https://www.cnblogs.com/jplatformx/p/4344575.html

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

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

相关文章

解锁计算机桌面,电脑锁屏按什么键解锁

按回车键即可解锁。具体的解锁过程如下1、先将电脑设置一个密码&#xff0c;再使用电脑锁屏快捷键将屏幕锁掉&#xff0c;最后按回车键解锁。首先在电脑桌面上点击开始菜单&#xff0c;找到控制面板点击并进入。2、然后在弹出的界面找到“用户账户和家庭安全”&#xff0c;并单…

ppt如何旋转流程图_张伟随笔37:我书写方程式和画流程图的方法

珠海海洋王国里的海象山张伟 2020.11.23我书写方程式和画流程图的方法首发/化学张伟/2020.05.13书写化学方程式&#xff0c;在word里面可以实现一部分&#xff0c;例如&#xff0c;我要书写高锰酸钾受热分解为锰酸钾、二氧化锰和氧气&#xff0c;化学式有上下标&#xff0c;可以…

职业技术人士学习捷径最快的网站

由于最近研究大数据相关的技术及前沿技术,对常用的几个网站做一下分享(包含技术网站+最新资讯网站): 1. 36Kr 网站:https://36kr.com/ 提供创业资讯、科技新闻、投融资对接、股权投资、极速融资等创业服务,致力成为创业者可以依赖的创业服务平台,为创业者提供最好的产品和…

单元测试编写_为什么要编写单元测试-测试技巧8

单元测试编写我对最近的博客“您应该测试什么”有很多React&#xff0c;有些人出于各种原因与我达成一致&#xff0c;另一些人则认为建议某些类可能不需要单元测试是完全危险的。 已经处理了什么测试&#xff0c;今天的博客涉及为什么要编写单元测试&#xff0c;而今天的示例代…

webapi get请求 FromUri list参数传递

今天做项目调用第三方的webapi时&#xff0c;发现get请求竟然用的是FromUri list参数&#xff0c;汗... 这里简单记录下请求传参的方式&#xff08;但不推荐大家使用get FromUri list参数 来定义webapi的功能&#xff09;&#xff1a; 1        HttpClient hClient new…

51cto 检测ip地址冲突_在Linux中发现IP地址冲突的方法

IP冲突&#xff0c;是不会像Windows那样&#xff0c;在右下角弹出冲突提示的。博主就出过一次糗&#xff0c;记得当时是在VM虚拟机里面安装了4个4个Redhat都是VM克隆出来的、完全一致的原来&#xff0c;是那台频繁掉线的虚拟系统和其他部门的办公电脑出现了IP冲突&#xff0c;由…

在计算机网络中可用于信息传输的介质,在计算机网络中,双绞线、同轴电缆及光纤等用于传输信息的载体被称为______介质。...

函数ReadDat()的功能是实现从文件ENG49.IN中读取一篇英文文章&#xff0c;存入到字符串数组xx中。请编制函数encryptChar()&#xff0c;按给定的替代关系对数组xx中所有字符进行替代&#xff0c;仍存入数组xx的对应的位置上&#xff0c;最后调用函数WriteDat()把结果xx输出到文…

7个顶级资源网站,不知道就很可惜

说起搜索资源&#xff0c;大家肯定先想到百度&#xff0c;的确“度娘”很万能&#xff0c;能帮我们解决很多问题&#xff0c;但毕竟百度资源有限&#xff0c;用的人多了就造成重复的问题&#xff0c;接下来&#xff0c;小编给大家分享7个顶级资源搜索网站&#xff0c;能满足你很…

使用ab对站点进行压力测试

测试指令&#xff1a; window下&#xff1a; E:\wamp\bin\apache\Apache2.2.21\bin> .\ab -V //查看是否按照了ab:(V 大写) E:\wamp\bin\apache\Apache2.2.21\bin> .\ab -n1000 -c100 http://www.harris.com linux 下&#xff1a; #ab -n1000 -c100 http://www.harris.…

通过Pax考试对JBoss Fuse 6.x进行集成测试,第一部分

JBoss Fuse是一个功能强大的分布式集成平台&#xff0c;具有内置功能&#xff0c;用于集中集成的微服务部署的集中式配置管理&#xff0c;服务发现&#xff0c;版本控制&#xff0c;API网关&#xff0c;负载平衡&#xff0c;故障转移等。 JBoss Fuse 6.x构建在Fabric8 1.x开源项…

【APICloud系列|3】开发APP对UI的一般性要求

以前用APICloud平台开发过一款APP&#xff0c;已经上线&#xff0c;现在担任CTO对UI普及一下常识。 总结 UI图&#xff1a;640*960、1280*720 图标大小&#xff1a;200*200、64*64 图片的格式&#xff1a;png 底部导航栏&#xff1a;两种图片不同颜色。 说明&#xff1a;

浙江大学计算机研究生分数线初试单科学科,计算机考研|这两所自划线,单科没过线也能复试?!...

东南、浙大&#xff01;单科没过线也能复试&#xff01;1.东南大学&#xff1a;统考考生(不含报考苏州联合研究生院考生和管理类联考考生)总分超过报考专业复试线20分以上&#xff0c;单科(限一门)可降2分。2.浙江大学&#xff1a;分数线(管理类联考除外)满足以下情况视同上线&…

python中改变参数值的方法_Python实现partial改变方法默认参数

Python实现partial改变方法默认参数时间&#xff1a;2020-11-18 06:19:00 作者&#xff1a;背锅熊 阅读&#xff1a;114次撤稿申请下边就看下简易的运用检测案例。实际编码以下&#xff1a;#!/usr/bin/env python# -*- coding: utf-8 -*-#python2.7x#partial.py#authror: orang…

量子计算机专业大学排名,世界十大新科技排名,量子计算机排第一名(2)

4、从空气中收集净水详细介绍&#xff1a;这项科技对于缺少水资源的国家地区来说会有很大的帮助&#xff0c;而且不需要耗费过多的资源。来自MIT和加州大学伯克利分校的研究团队通过一类新型多孔晶体——金属有机骨架&#xff0c;在空气湿度低至20%的环境下成功收集净水&#x…

java 拉起服务_技术开发者应该如何构建小团队的微服务方案?

作者 | 徐鹏责编 | 刘静出品 | CSDN(ID&#xff1a;CSDNnews)我们的产品是Linkflow&#xff0c;企业运营人员使用的客户数据平台(CDP)。产品的一个重要部分类似企业版的”捷径”&#xff0c;让运营人员可以像搭乐高积木一样创建企业的自动化流程&#xff0c;无需编程即可让数据…

【APICloud系列|4】APP设计统一图标大小的方法

当我们想要在整理设计稿中出现的图标&#xff0c;整理除了汇总之外&#xff0c;还需要重新调整一下图标的大小&#xff0c;使他们看起来“差不多大”。想要弄成一致性和统一性&#xff0c;非常的麻烦和耗时。 最后在谷歌的Material Design找到了一种规定的方式。 举例&#x…

Spicy Spring:动态创建自己的BeanDefinition

当我们有一个Spring托管的应用程序时&#xff0c;我们想让Spring管理所有的bean。 除了使用已知解决方案&#xff08;例如带注释的bean&#xff0c;Java配置和XML配置&#xff09;创建bean的常规方法之外&#xff0c;还有一种方法可以用来创建自己的BeanDefinition 。 使用Bea…

【APICloud系列|5】一键生成APP所有图标

图标尺寸一般为&#xff1a;16*16px、512*512px、1024*1024px. 生成APP常见的图标尺寸的办法有2种&#xff1a; 第一种&#xff1a;自己根据设计出来的APP图标尺寸自己调整图标icon尺寸大小。 第二种&#xff1a;借助第三方神器和在线生成图标icon工具来完成。 1.网址&#xff…

台式计算机调整显示亮度,台式电脑显示器屏幕亮度怎么调节?

电脑屏幕过高会对眼睛造成伤害&#xff0c;在晚上用电脑工作时尤其如此。那么&#xff0c;台式电脑显示器屏幕亮度该怎么调节呢&#xff1f;一 利用屏幕按键调节电脑显示器上带有几个按键&#xff0c;通过它可以调节屏幕亮度。这个很简单&#xff0c;除了一个是关闭屏幕亮度的按…

html排序按钮_插件分享 | 可进行排序扫描任务的Task Queue

前言&#xff1a;在以往hvv场景中使用Goby的过程总是存在一个痛点&#xff1a;时间短&#xff0c;目标多&#xff0c;只能盯着扫描进度结束后才能手动返回到初始界面开启下一个扫描任务(内心极度狂躁)。本次Goby更新后又开放了新的插件入口点以及API&#xff0c;使添加扫描任务…