Linux Bash Shell编程(八):条件判断与示例

Stella981
• 阅读 1068

Linux Bash Shell编程(八):条件判断语句与示例

  上一节中,我们了解了字符串截取和处理的相关命令,可以对命令的输出数据流进行筛选截取。本节开始,就到了Bash Shell编程最关键的部分:条件判断和流程控制语句。本节中,我们先熟悉条件判断的各种类型、形式。

Linux Bash Shell编程(八):条件判断与示例

条件判断的基本语法

  条件判断的基本语法主要有两种:基于命令行的test命令和更适合于嵌入流程控制语句的条件样式。

  1. test 命令
      test命令以命令行的形式运行条件判断语句,不会有任何标准输出,该语句的执行结果被保存在预定义变量$?中(注意,$?值类似于程序返回值,而不是布尔型数据,$? 0为真,1为假),可以直接用echo命令查看,也可被多命令逻辑关系符调用,更符合使用者的习惯,但在Shell脚本中使用不便,一般不建议在Shell中使用

    test 条件判断语句 #为了观察实际效果,一般使用echo命令查看$?预定义变量 echo $? #0为真,1为假

    #例如:(判断语句的具体分类在下面讲到) test -e Hello_World.sh echo $?

  2. []包含的条件样式

      用[]包含的条件判断表达式功能与test命令相同,不采用命令式结构,可以方便地嵌入流程控制语句中作为条件,返回值同样在预定义变量$?中,除了形式不同,其余与test命令完全相同

    注意:[ ]内侧两边必须有空格,否则命令执行报错

    [ 条件判断语句 ] #同样使用echo命令查看条件判断语句结果 echo $?

    #例如:(判断语句的具体分类在下面讲到) [ -e Hello_World.sh ] echo $?

条件判断语句类型

按照文件类型判断

在选项后加文件名,可以判断文件(若存在)类型是否符合条件,若文件不存在直接返回假,符合条件返回真,具体文件类型判断符与ls命令结果中文件属性第一位相似

[选项 文件名]
#echo #?

选项

作用

-b

判断文件(若存在 (下同))是否为块设备文件(是为真 (下同))

-c

判断文件是否为字符设备文件

-d

判断文件是否为目录文件

-e

exist 仅判断文件是否存在

-f

file 判断文件是否为普通文件

-L

判断文件是否为符号链接文件

-p

判断文件是否为管道文件

-s

判断文件是否非空(非空为真)

-S

判断文件是否为套接字文件

按照文件权限判断

同样要在选项后加文件名,有权限为真,无权限或文件不存在为假。(判断的是当前用户对这个文件的权限)

选项

作用

-r

判断对该文件是否有读权限

-w

判断对该文件是否有写权限

-x

判断对该文件是否有执行权限

-u

判断对该文件是否有SUID权限

-g

判断对该文件/目录是否有SGID权限

-k

判断对该目录是否有SBIT权限

比较两个文件的信息

格式:文件1 [选项] 文件2

选项

作用

-nt

newer than判断文件1的最后修改时间是否比文件2晚,晚为真(0)

-ot

older than 判断文件1的最后修改时间是否比文件2早,早为真(0)

-ef

判断两个文件的Inode号是否一致,近似为两个文件是否相同

  • 其中,Inode号是标识文件的序号,两个不同的文件可以名称相同,但Inode号不能相同,若两个文件为硬链接(保存为副本、同步更新)关系,则两文件的Inode号才会相同,其余不同
  • 两个硬链接的文件,除了Inode号相同外没有任何标志,可以使用这个判断方式判断硬链接

比较两个整数

若为两个变量,不需要声明为整型格式,语法:整数1 [选项] 整数2

选项

作用

-eq

equal 判断两个整数是否相等

-ne

not equal 判断两个整数是否不等

-gt

greater than判断整数1是否大于整数2

-lt

less than 判断整数1是否小于整数2

-ge

greater/equal 判断整数1是否大于等于整数2

-le

less/equal 判断整数1是否小于等于整数2

判断字符串相关

语法包含在选项中,注意:两个字符串比较相关的判断符两边都要加空格,否则无论如何,返回值均为真

选项

作用

-z 字符串

判断字符串是否为空

-n 字符串

判断字符串是否非空

字符串1 == 字符串2

判断两个字符串是否相等

字符串1 != 字符串2

判断两个字符串是否不等

  • 当字符串是变量时,如果变量没有定义,则同样视作空字符串

两个判断条件的逻辑关系

同时使用两个判断条件时,要注意它们之间的逻辑关系,两个判断条件的格式:条件1 [选项] 条件2

选项

作用

-a

逻辑与,两个条件都成立才成立

-o

逻辑或,两个条件有一个成立就成立

! [条件]

逻辑非,使判断结果取反(注意,!与条件之间有空格


条件判断语句与多命令逻辑符连用

  关于多命令顺序与逻辑符,请参阅Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号

  实际上,多命令顺序与逻辑符判断前一个命令是否执行的方式就是判断预定义变量$?的值是否为0,所以可以直接将条件判断语句看作一个命令加入多命令顺序语句中,条件判断为真相当于正确执行了上一个语句。


示例

示例1,判断文件是否存在:

[ -e ./test.sh ] && echo "File exists" || echo "File not found"
#条件判断语句方括号内侧必须有空格
#该命令执行,若文件存在,显示"File exists";否则显示"File not found"

示例2,用多命令逻辑符构建单行比大小程序:

#以下为test5.sh中的内容
#!/bin/bash

#Author:Zheng

read -p "a= " a
read -p "b= " b #通过键盘读入a,b数据,请参阅(四)
[ $a -lt $b ] && echo "a<b" || echo "a>=b"

示例3,多条件判断语句:判断输入变量是否为空并且是否值小于10

#以下为test6.sh中内容
#!/bin/bash

#Author: Zheng

read -p "Input a: " a
#若a非空且小于10,则输出Yes
[ -n $a -a $a -lt 10 ] && echo "Yes" || echo "No"
#此脚本中未加入判断a是否为整数的条件,留待改进

索引

下一节,我们将学习Bash流程控制语句

上一节,Linux Bash Shell编程(七):字符串截取与处理(cut、printf、awk、sed)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Stella981 Stella981
2年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
2年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这