Linux之shell条件测试

news2025/1/13 2:30:20

目录

作用

基本用法

格式:

案例

-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 "还能接受"

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

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

相关文章

Spring----IOC、注解

目录 一、简介 二、spring的组成及拓展 spring七大模块 核心容器(Spring core) Spring上下文(Spring context) Spring面向切面编程(Spring AOP) Spring DAO模块 Spring ORM模块 Spring Web模块 Spring MVC框架(Spring WebMVC) 拓展 三、IOC理论 IOC本质 Hello S…

11.(Python数模)(预测模型三)多元线性回归预测

多元线性回归 简介 多元线性回归使用在自变量和因变量有逻辑相关性的情况中。在实际应用中&#xff0c;多元线性回归经常用于探索和解释变量之间的复杂关系&#xff0c;例如经济学、社会科学和自然科学等领域。它提供了一种统计工具来分析多个自变量对因变量的影响&#xff0…

Windows下使用source insight连接远程Linux机器写代码

命令总结 基本会用到的命令都在这里了&#xff0c;流程里面就不加命令了&#xff0c;自行看表格 流程 linux安装 samba&#xff0c;并确认版本&#xff0c;确认samba服务运行状态配置samba用户配置samba的配置文件 在文件最后增加 示例如下&#xff1a; security user [pub…

大模型参数高效微调PEFT的理解和应用

简介 近年的大型语言模型&#xff08;也被称作基础模型&#xff09;&#xff0c;大多是采用大量资料数据和庞大模型参数训练的结果&#xff0c;比如常见的ChatGPT3有175B的模型参数量。随着Large Language Model(LLM)的横空出世&#xff0c;网络模型对常见问题的解答有了很强的…

分享大数据分析培训就业班课程内容

随着国家重视大数据&#xff0c;政府扶持大数据&#xff0c;大数据在企业中生根发芽根据人社部发布的《新职业--大数据工程技术人员就业景气现状分析报告》预计&#xff0c;未来5年&#xff0c;大数据行业的人才需求将保持30%-40%的增速&#xff0c;人才缺口总量将达到2000万人…

冠达管理股票分析:权益分派前买入好不好?

随着股票市场的不断升温&#xff0c;出资者们也越来越关注买入时机的把握。而其中一个重要的要素就是权益分配。那么&#xff0c;权益分配前买入好不好呢&#xff1f;本文将从多个视点进行剖析。 1、剖析权益分配对股价的影响&#xff0c;推断买入时机的合理性。权益分配是上市…

地图结构 | 图解占据栅格地图原理(附Matlab建图实验)

目录 0 专栏介绍1 栅格地图1.1 应用场景1.2 基本概念 2 占据栅格地图2.1 更新模型2.2 截断策略 3 仿真实现3.1 算法流程3.2 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索…

蚂蚁开源编程大模型,提高开发效率

据悉&#xff0c;日前蚂蚁集团首次开源了代码大模型 CodeFuse&#xff0c;而这是蚂蚁自研的代码生成专属大模型&#xff0c;可以根据开发者的输入提供智能建议和实时支持&#xff0c;帮助开发者自动生成代码、自动增加注释、自动生成测试用例、修复和优化代码等kslouitusrtdf。…

小红书母婴行业文案怎么写,创作方向有哪些?

行业文案顾名思义就是有关于某个行业的文案&#xff0c;不过此类内容一般都具有商业性。随着互联网的深入&#xff0c;怎么对行业文案进行创作&#xff0c;也成为品牌的日常工作。今天为大家分享下小红书母婴行业文案怎么写&#xff0c;创作方向有哪些&#xff1f; 首先&#x…

arppy gis 读取text 并批量添加字段 arcpy.AddField_management

arppy gis 读取text 并批量添加字段 arcpy.AddField_management 例&#xff1a;给“省级行政区域”添加“A、B、C、D” 4个字段。 &#xff08;1&#xff09;用Excel制作出字段及其描述表&#xff0c;定义字段结构&#xff1b; &#xff08;2&#xff09;复制除标题行以为的内…

windows本地验证码识别小工具

windows本地验证码识别小工具 - 可以用在windows系统中&#xff0c;并可以集成在Java或python程序中 演示视频如下&#xff1a;可用于识别4-7位的字母数字组合的验证码&#xff08;识别准确率在70% - 80%&#xff09;。 验证码识别演示 本项目未开源&#xff0c;如需使用请联…

DELL 台式机的内置扬声器如何关闭

DELL 台式机的内置扬声器如何关闭&#xff1f; 点“开始”——控制面板——高清晰音频管理器——右上角“设备高级设置”——“播放设备”——点击“使前部和后部设备播放不同的音频流”前面的小方框——“确认”。ok了。

14-JVM调优实战-常量池详解

上一篇&#xff1a;13-JVM调优实战-3 最后&#xff0c;来一个算是补充拓展知识点&#xff0c;希望可以帮到你。 1.Class常量池与运行时常量池 Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外&#xff0c;还有…

win7安装不了python3.10.8

今天安装python3.10.8&#xff0c;发现安装失败。原来是win7不支持python3.10.8。 如图&#xff1a; 安装出现问题&#xff1a; win7能安装python3哪个版本&#xff0c;我正在测试。到时补充编辑。

Web Components详解-Shadow DOM插槽

前言 插槽实际上也属于组件通信的一种方式&#xff0c;但是由于其强大的api和实用性&#xff0c;我将其单独拆开来介绍。 定义 Slot&#xff08;插槽&#xff09;是Web Components中一个重要的特性&#xff0c;它允许在组件内部定义占位符&#xff0c;以便父组件可以向其中插…

好用的工具推荐

1 chatgpt国内版 ChatMindAI ChatMindAI-智慧学习&#xff0c;办公无忧&#xff0c;AIGC让生活更简单https://x.chatmindai.net/explore

sovits远程访问设置

感谢阅读 把blocks.py的如下部分&#xff0c;false改为true

无涯教程-JavaScript - DOLLARDE函数

描述 DOLLARDE函数将以整数部分和小数部分(如1.02)表示的美元价格转换为以十进制数表示的美元价格。分数美元数字有时用于证券价格。值的小数部分除以您指定的整数。 语法 DOLLARDE (fractional_dollar, fraction)争论 Argument描述Required/OptionalFractional_dollarA nu…

SpringMVC的文件上传文件下载多文件上传---详细介绍

目录 前言&#xff1a; 一&#xff0c;文件上传 1.1 添加依赖 1.2 配置文件上传解析器 1.3 表单设置 1.4 文件上传的实现 二&#xff0c;文件下载 controller层 前端jsp 三&#xff0c;多文件上传 Controller层 运行 前言&#xff1a; Spring MVC 是一个基于 Java …

使用迭代方式解决汉诺塔问题(Java语言)

目录 汉诺塔问题解决 迭代介绍 汉诺塔问题解决 在这个Java示例中&#xff0c;我们使用了一个Stack数据结构来模拟递归调用的过程。hanoiIterative函数接受盘子数量n以及三个柱子的名称作为参数&#xff0c;并在迭代过程中模拟汉诺塔的移动操作。moveDisk函数用于模拟盘子的移…