Linux之shell条件测试

2023-09-11 11:22:26

目录

作用

基本用法

格式:

案例

-f 用法

[ ] 用法

[[]] 用法

(()) 语法

文件测试

参数

案例

编写脚本,测试文件是否存在,不存在则创建

整数测试

作用

操作符

案例

系统用户个数小于50的则输出信息

逻辑操作符

符号

案例

命令分隔符

案例分析

案例1 --- 判断当前已登录的账户数,超过5个则输出信息

案例2 --- 取出/etc/passwd 文件的第6行内容

案例3 --- 编写脚本,功能:显示root目录下的文件信息,之后建立一个名为aa的目录,在aa目录下新建文件bb.txt,并增加bb.txt的x执行权限

案例4 --- 编写脚本test7.sh, 从键盘读入x,y值,计算和值后输出结果

案例5 --- 编写脚本test8.sh,给定文件/etc/sos/sos.conf,判断此文件是否有空白行,有则输出空白行的行数,无则输出信息表示无空白行

案例6 --- 编写脚本test9.sh,显示所有用户,选择一个用户输入,若id为0表示管理员,否则为普通账户

案例7 --- 如果/var/log/messages 文件行数大于50行,则显示“好大一个文件”,否则显示“还能接受”


作用

        为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符

        通过这些运算符,Shell程序能够判断某种或者几个条件是否成立

        条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以了解和掌握这些条件测试是非常重要的

基本用法

格式:

        格式1 ---  test  -参数  条件表达式
        格式2 --- [  条件表达式  ]     # 注意:[]的左右要有空格
        格式3 --- [[  条件表达式  ]]   # 注意:[]的左右要有空格
        格式4 --- ((条件表达式))

test单独使用,判断条件为真,echo¥?返回0,假返回1

test与[[ ]]等价

        [[ ]]是扩展命令,可以使用通配符等进行模式匹配,&& || >< 等操作符可以直接应用于双括号中,但不能用于单括号中

案例

-f 用法
[root@localhost ~]# test -f /etc/passwd    # -f测试文件是否为普通文件
[root@localhost ~]# echo $?
0    # 状态码为0,表示上例命令执行正确,文件存在

[root@localhost ~]# test -f /etc/aaaa
[root@localhost ~]# echo $?
1    # 状态码为1,表示上例命令执行错误,文件不存在

[root@localhost ~]# test -f /etc/passwd && echo yes || echo no
yes
[root@localhost ~]# test -f /etc/aaaa && echo yes || echo no
no

[ ] 用法
[root@localhost ~]# [ -f /etc/hosts ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -f /etc/aaaa  ]
[root@localhost ~]# echo $?
1

[root@localhost ~]# [ -f /etc/hosts ] && echo "存在" || echo "不存在"
存在
[root@localhost ~]# [ -f /etc/aaa ] && echo "存在" || echo "不存在"
不存在

[[]] 用法
[root@localhost ~]# [[ 3 > 2 || 1 > 2 ]] && echo "正确" || echo "不正确"
正确

(()) 语法
[root@localhost ~]# ((3>5)) &&  echo 1 || echo 0
0
[root@localhost ~]# ((9.5>5)) &&  echo 1 || echo 0
-bash: ((: 9.5>5: syntax error: invalid arithmetic operator (error token is ".5>5")

文件测试

参数

参数作用
-b 文件名检测文件是否是块设备文件,是返回 true
-c 文件名是否是字符设备文件
-d 文件名是否是目录
-f 文件名是否是普通文件(既不是目录,也不是设备文件)
-S 文件名是否为socket文件
-P 文件名是否为管道符文件
-L 文件名是否为链接文件
-u 文件名是否有suid的权限
-s 文件名是否为空(文件大小是否大于0),不为空返回 true
-e 文件名检测文件(包括目录)是否存在,如果是,则返回 true
-r 文件名检测文件是否可读,如果是,则返回 true。
-w 文件名检测文件是否可写,如果是,则返回 true
-x 文件名检测文件是否可执行,如果是,则返回 true
f1 -nt f2文件f1比文件f2新则为真(根据文件修改时间计算
f1 -ot f2文件f1比文件f2旧则为真(根据文件修改时间计算)

案例

[root@localhost ~]# [ -b /etc/name0n1 ] && echo 1 || echo 0
0
[root@localhost ~]# [ -L /dev/cdrom ] && echo 1 || echo 1
1
[root@localhost ~]# [ -e /test ] && echo 1 || echo 1
1

编写脚本,测试文件是否存在,不存在则创建
[root@localhost test]# vim test1.sh
#!/bin/bash
  
read -p "请输入文件名:" file

if test -e $file
then
        echo "$file 文件存在"
else
        echo "$file 文件不存在"
        read -p "是否需要创建(yes or no)" flag
        if [ $flag == "yes" ]
        then
                touch "$file"
                ls -l $file
        fi
fi

[root@localhost test]# bash test1.sh 
请输入文件名:/test/test4.sh
[root@localhost test]# bash test1.sh 
请输入文件名:/test/test2.sh
是否需要创建(yes or no)yes
-rw-r--r--. 1 root root 0 Sep 10 19:28 /test/test2.sh
[root@localhost test]# ls

整数测试

作用

        用于比较两个数值的大小关系,操作的对象时数值

操作符

在[ ]以及 test 中使用的比较符号在(( ))和 [[ ]] 中使用比符号说明
-eg== 或 =相等,全拼为 equal
-ne!=不相等,全拼为 not equal
-gt>大于,全拼为 greater than
-ge>=大于等于,全拼为 greater equal
-It<小于,全拼为 less than
-le<=小于等于,全拼为 less equal

案例

[root@localhost test]# [ 5 -gt 3 ] && echo yes || echo no
yes
[root@localhost test]# test 2 -lt 1 && echo yes || echo no
no
[root@localhost test]# (( 5 > 3 )) && echo yes || echo no
yes

系统用户个数小于50的则输出信息
[root@localhost test]# [ $(cat /etc/passwd | wc -l ) -lt 50 ] && echo "用户数小于
50"

逻辑操作符

符号

在[]和 test 中使用的操作符在[[ ]] 和(())中用符说明
-a&&and,与,两端都为真,则结果为真
-o||or,或,两端有一个为真,则结果为真
!

not,非,两端相反,则结果为真

案例

[root@localhost ~]# [ -f /etc/passwd -a -f /etc/services ] && echo yes || echo no
[root@localhost ~]# [ -f /etc/host -a -f /etc/services ] && echo yes || echo no
[root@localhost ~]# ((5>3 && 3>2)) && echo 1 || echo 0

命令分隔符

符号说明
cmd1;cmd2以独立的进程依次执行cmd1和cmd2
(cmd1;cmd2)在同一进程中依次执行cmd1和cmd2
cmd1&cmd2 cmd1和cmd2同时执行,分属于不同的进程
cmd1&&cmd2  当cmd1为真时,则执行cmd2
cmd1||cmd2当cmd1不为真时,则执行cmd2
cmd&   后台执行

案例分析

案例1 --- 判断当前已登录的账户数,超过5个则输出信息

[root@localhost ~]# [ $(who | cut -d " " -f1 | sort -u | wc -l) -gt 5 ] && echo "账户数过多" || echo "账户数较少"

案例2 --- 取出/etc/passwd 文件的第6行内容

[root@localhost ~]# head -6 /etc/passwd | tail -1

[root@localhost ~]# sed -n 6p /etc/passwd

案例3 --- 编写脚本,功能:显示root目录下的文件信息,之后建立一个名为aa的目录,在aa目录下新建文件bb.txt,并增加bb.txt的x执行权限

[root@localhost ~]# vim mkf.sh
#!/bin/bash
ls -l /root
mkdir /root/aa
touch /root/aa/bb.txt
chmod +x /root/aa/bb.txt

[root@localhost ~]# bash mkf.sh 

案例4 --- 编写脚本test7.sh, 从键盘读入x,y值,计算和值后输出结果

[root@localhost ~]# vim test7.sh 
#!/bin/bash
  
read  -p  "请输入x的值: "   x

read  -p  "请输入y的值: "   y

if  [ -n  "$x"  -a  -n  "$y" ] # -n 判断是否为空 -a 与
then
        if  [[ "$x"  =~  ^[0-9]+$  ]]  &&  [[ "$y"  =~  ^[0-9]+$  ]]
# =~ 是一个正则表达式匹配运算符,用于测试左边的字符串是否匹配右边
# ^[0-9]+$ 是一个正则表达式模式,它表示一个字符串应该由一个或多个数字字符组成
        then
                sum=$[x+y]
                echo  "$x+$y=$sum"
        else
                echo  "请输入数字"
        fi
else
        echo  "请输入有效数字"
fi

测试

案例5 --- 编写脚本test8.sh,给定文件/etc/sos/sos.conf,判断此文件是否有空白行,有则输出空白行的行数,无则输出信息表示无空白行

[root@localhost ~]# vim test8.sh
#!/bin/bash

read -p "请输入要统计的文件名:" file

num=$(grep ^$ $file | wc -l)

if (($num>0))
then
        echo "$file含有空白行,行数为:$num行,位置如下:"
        grep -n ^$ $file
else    
        echo "$file,此文件不包含空白行"
fi      

测试

案例6 --- 编写脚本test9.sh,显示所有用户,选择一个用户输入,若id为0表示管理员,否则为普通账户

[root@localhost ~]# vim test9.sh
    #!/bin/bash

cat /etc/passwd | cut -d ":" -f1 | sort -u
read -p "请输入一个账户:" us
if (($(id -u $us)==0))
then    
        echo "此用户为管理员"
else    
        echo "此用户为普通账户"
fi 

测试

案例7 --- 如果/var/log/messages 文件行数大于50行,则显示“好大一个文件”,否则显示“还能接受”

[root@localhost ~]# (($(cat /var/log/messages | wc -l )>50 )) && echo "好大一个文 件" || echo "还能接受"

更多推荐

HashMap:Java中的高性能键值对存储

一、前言HashMap是Java中最常用的数据结构之一,用于存储键值对,提供了快速的数据检索和插入操作。本文将深入探讨HashMap的内部原理、用法、常见面试问题以及源码分析。二、HashMap的内部工作原理2.1哈希表HashMap的核心是哈希表,它是一个数组,用于存储键值对。哈希表的每个位置称为"桶",每个桶可以存

Http和Https

Http和Https1.URI和URLURI(UniformResourceIdentifier):统一资源标识符,标识资源,可以是相对路径也可以绝对路径表示。绝对路径:http://www.example.com/images/logo.png相对路径:/image/logo.pngURL(UniformResour

Java8实战-总结28

Java8实战-总结28用流收集数据收集器接口理解Collector接口声明的方法全部融合到一起用流收集数据收集器接口Collector接口包含了一系列方法,为实现具体的归约操作(即收集器)提供了范本。Collector接口中实现了许多收集器,例如toList或groupingBy。这也意味着,可以为Collector

MongoDB

1.安装dockerrun--restart=always-d--namemongo-v/home/206/mongodb/data:/data/db-p27017:27017mongo:4.0.62.建立数据库3.MongoDB使用基于SpringBoot使用3.1引用依赖包<!--SpringDataMongoDB

数据湖是什么?数据湖架构及应用(完)

数据湖架构数据湖架构主要描述了各组件以及组件之间的关系,说明了数据的存储、处理和访问过程。数据湖架构研究最初主要涉及到数据的划分、管理和使用方式,随着研究的进展数据湖的架构包含了更深层次的关键技术和方案。分区架构在初始的数据湖设计中,数据预处理扮演着极为关键的角色,其中最核心的架构为池架构与分区架构。池架构将数据根据不

【计算机网络】 TCP流量控制——滑动窗口和累积应答

文章目录累积应答TCP流量控制——滑动窗口累积应答我们前面所说的是我们每发送一个包对端就要回一个ack,那么这样效率太慢了,我们这里就有一个累积应答的机制,就是说我们客户端累积发送多个包,然后服务端再统一进行回复。TCP流量控制——滑动窗口那么我们累积应答时具体发送多少数据之后统一回复一个ack是由什么决定的呢,就是由

kubernetes

k8s是什么1以容器为中心的应用编排平台2.面向平台的平台:强大的扩展能力:构建其它的平台3、容器编排容器生命周期管理容器创建、运行、监控、终止为容器运行提供支撑:存储卷:卷编排网络:网络编排容器关系管理超亲密关系:运行一个整体,Kubernetes抽象出来的新概念Pod非超亲密关系:各自独立运行通过Service互相

肖sir_环境搭建之面试题(答案供参考)_003

课堂巩固练习(可以百度,查询)1、请简述dym的搭建、用到了哪些工具和流程介绍服务器系统:centos6;工具:jdk,MySQL,tomcat;流程:创建数据库,导入数据表–>安装jdk,解压tomcat–>将war代码包放到tomcat中解压—>进入解压的包里配置数据库连接—>进入浏览器打开前端及管理端参考:简化流

Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令

安装软件包:Ubuntu:apt-getinstallpackage_nameCentOS7:yuminstallpackage_name更新软件包列表:Ubuntu:apt-getupdateCentOS7:yumupdate卸载软件包:Ubuntu:apt-getremovepackage_nameCentOS7:

Vue学习笔记

本博客记录Vuev2.7.8的学习,参考文档目录Vue概述入门案例Vue指令v-bind和v-modelv-onv-if和v-showv-for综合案例生命周期Vue概述一个完整的html页面包括了视图和数据,数据是通过请求从后台获取的,那么意味着我们需要将后台获取到的数据呈现到页面上,很明显,这就需要我们使用DOM操

机器学习的基本代码

步骤1:导入必要的库```pythonimportpandasaspdfromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.naive_bayesimportMultinomialNBfromsklearn.metricsimportac

热文推荐