shell的条件测试

news2024/9/24 1:25:49
  • 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。
  • 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。
  • 条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以了解和掌握这些条件测试是非常重要的。

一、条件测试的基本语法

  •         在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。
  •         当指定的条件为真时,整个条件测试的返回值为0
  •         反之,如果指定的条件为假,则条件测试语句的返回值为非0值。


二、文件测试表达式

测试文件的读、写、执行等属性,不光是根据文件属性 rwx 的标识来判断,还要看当前执行测试的用户 是否真的可以按照对应的权限操作文件。

经典案例

[root@server ~] # [ -d /root ] && echo y || echo n
y
[root@server ~] # [ -d /aa ] && echo y || echo n
n
[root@server ~] # [ -b /dev/nvme0n1 ] && echo y || echo n
y
[root@server ~] # [ -L /dev/cdrom ] && echo y || echo n
y
[root@server ~] # ll /dev/cdrom
lrwxrwxrwx 1 root root 3 3 22 11 :31 /dev/cdrom - > sr0
[root@server ~] # [ -e /file1 ] && echo y || echo n
n
[root@server ~] # touch /file1
[root@server ~] # [ -e /file1 ] && echo y || echo n
y

nvme0是你的ssd硬盘的主控芯片,

nvme0n1是你的ssd硬盘的主存储器。

Linux中的/dev/cdrom代表光驱。‌

        在Linux系统中,‌/dev目录用于储存硬件设备信息,‌通过其下的目录可以直接访问硬件。‌/dev/cdrom是光驱的设备名,‌而/dev/sr0也是光驱的设备名;

  /dev/cdrom/dev/sr0的软链接。‌这意味着,‌当你访问/dev/cdrom时,‌你实际上是在访问/dev/sr0

常用参数

test示例:

②、[ ]示例(注意测试表达式和方括号两边需要有空格)

③、[[ ]]示例(注意测试表达式和[[]]两边需要有空格)

④、注意:如果测试的文件路径是用变量来代替,变量一定要加引号

设置一个空的变量:file

⑤、(()) 语法

[root@server ~] # ((9>5)) && echo 1 || echo 0
1
[root@server ~] # (( 9 > 5 )) && echo 1 || echo 0
1
[root@server ~] # ((9>5)) && echo 1 || echo 0
1
[root@server ~] # ((9>13)) && echo 1 || echo 0
0
[root@server ~] # ((9>13.5)) && echo 1 || echo 0 # 注意:不支持小数运算
-bash : ((: 9 >13.5 :语法错误 : 无效的算术运算符 ( 错误符号是 ".5" )
0

三、字符串测试表达式

①、test案例

[root@localhost s] # test -n abc;echo $?
0
[root@localhost s] # test -n "";echo $?
1
[root@localhost s] # test -n " ";echo $?
0
[root@localhost s] # test -z '';echo $?
0
[root@localhost s] # test -z abc;echo $?
1
[root@localhost s] # test -z ' ';echo $?
1
[root@localhost s] # test abc = abcd ;echo $? # 注意等号两边需要有空格
1
[root@localhost s] # test abc=abcd ;echo $?
0

②、[ ]案例

[root@localhost s] # [ -n '' ];echo $?
1
[root@localhost s] # [ -n ' ' ];echo $?
0
[root@localhost s] # [ -z '' ];echo $?
0
[root@localhost s] # [ abc=abcd ];echo $?
0
[root@localhost s] # [ abc = abcd ];echo $? # 注意等号两边需要有空格
1

③、[[ ]]案例

[root@localhost s] # [[ -n abc ]];echo $?
0
[root@localhost s] # [[ -n ' ' ]];echo $?
0
[root@localhost s] # [[ -n '' ]];echo $?
1
[root@localhost s] # [[ abc=acd ]] ;echo $?
0
[root@localhost s] # [[ abc = acd ]] ;echo $? # 注意等号两边需要有空格
1

④、注意:测试对象是变量时,变量需要加引号

[root@localhost s] # test -n $name;echo $?
0
[root@localhost s] # test -n "$name";echo $?
1
[root@localhost s] # [ -n $name ];echo $?
0
[root@localhost s] # [ -n "$name" ];echo $?
1

四、 整数测试表达式

注意:
  • =和!=也可在[]中作比较时使用,在[]中也可使用><符号,但需要使用反斜线转义,有时不转译虽然语 法不会报错,但是结果可能会不对;
  • 在[[]]中也可使用包含-gt-lt的符号,不建议使用;
  • 比较符号两端也要有空格。

①、test案例

[root@localhost test3] # test 2 -eq 3;echo $?
1
[root@localhost test3] # test 2 -eq 2;echo $?
0

②、[ ]案例

[root@localhost test3] # [ 2 -ne 3 ];echo $?
0
[root@localhost test3] # [ 2 -ne 2 ];echo $?
1

③、[[ ]]案例

[root@localhost test3] # [[ 2 != 3 ]];echo $?
0
[root@localhost test3] # [[ 2 != 2 ]];echo $?
1
[root@localhost test3] # [[ 2!=2 ]];echo $? 未写空格,导致出错
0

④、(())案例

[root@localhost test3] # (( 2!=3 ));echo $?
0
[root@localhost test3] # ((2!=3));echo $?
0
[root@localhost test3] # ((2=3));echo $?
-bash : ((: 2 = 3 : attempted assignment to non-variable (error token is "=3" )
1
[root@localhost test3] # ((2==3));echo $?
1
[root@localhost test3] # ((2>3));echo $?
1
[root@localhost test3] # ((2<3));echo $?
0


五、 逻辑操作符

[root@server s]# ll
总用量 24
-rw-r--r--.   1 root root   1      8月  9 17:15 1
-rw-r--r--.   1 root root  13     8月  9 11:45 test
-rwxr-xr-x. 1 root root   104  8月  9 11:59 test1.sh
-rw-r--r--.   1 root root   0      8月  9 12:06 test2.s
-rwxr-xr-x. 1 root root   146  8月  9 12:08 test2.sh
-rwxr-xr-x. 1 root root    66   8月  9 12:33 test3.sh
-rwxr-xr-x. 1 root root    92   8月  9 11:56 test4.sh
[root@server s]# [  -d test -a -f test ];echo $?
1
[root@server s]# [  -d test -o -f test ];echo $?
0
[root@server s]# test -f 1 && echo 1 || echo 0
1
[root@server s]#  ! test -f test;echo $?
1

注:命令1 && 命令2,如果命令1执行不成功,则命令2不执行。
命令3 || 命令4,如果命令3成功,不执行命令4;如果命令3不成功,则执行命令4

六、练习

1

通过 read 传入一个数字,如果传入的数字等于 1 ,就打印 1 ;如果等于 2 ,就打印 2 ,如果不等于 1 也不等于2 ,就提示输入不对,然后退出程序。

2

通过 read 读入两个整数,并比较他们的大小

3

假设执行一个可以携带参数的 script ,执行该脚本后屏幕会显示如下的数据:
程序的文件名;共有几个参数;若参数的个数小于 2 个则告知用户参数数量太少;全部的参数内容;第一 个参数;第二个参数。
echo "the script name is $0 "
echo "the parameter number is $# "
[ " $# " -lt 2 ] && echo "the number of parameter is less than 2." && exit 0
在方括号内的每个组件都需要由空格键来分隔(特别注意中括号的两端需要有空格符来分隔);在方括 号内的变量,最好都要以双引号括起;在方括号内的常量最好都以单或双引号括起来。(中括号的使用方法与test 几乎一模一样)

 

echo "your whole parameter is ' $@ '"
echo "the 1st parameter is $1 "
echo "the 2nd parameter is $2 "

七、 特殊条件测试表达式案例:

[ 条件 1 ] &&
命令 1
命令 2
命令 3
[[ 条件 1 ]] &&
命令 1
命令 2
命令 3
test 条件 1 &&
命令 1
命令 2
命令 3
if [ 条件 1 ]
then
命令 1
命令 2
命令 3
fi

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

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

相关文章

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…

微信小程序流量主收益

小程序流量主已经开通三天了,目前收益1.42,,,,,,,,,,,,,,,不过确实点击量不怎么多 再附上我的流量主小程序 点击量如果上去的话,收益应该还是可观的,有想开流量主的任何问题都可以骚扰我,,对小程序有任何意见也欢迎反馈~ 一起进步,一起学习~

CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)

一、安装 1.下载相关openssl包 下载地址&#xff1a; https://www.openssl.org/source/ 2.将下载好的压缩包放到 /app/server/nginx 路径下&#xff08;根据自己实际需求定义&#xff09; 3.切换至该路径 cd /app/server/nginx4.压缩包解压 压缩包解压 &#xff1a;tar -…

矩阵算法的介绍和实现

一. 介绍 首先我们要清楚矩阵是什么&#xff1a;矩阵是一个按照长方阵列排列的复数或实数集合 1> 定义 定义&#xff1a;mn矩阵为mn个数排成的m行n列的表格&#xff0c;当mn时&#xff0c;矩阵A称为n阶方阵或者n阶矩阵。零矩阵&#xff1a;矩阵所有元素都为0。同型矩阵&a…

Centos7.6配置阿里云镜像源

1、备份本地镜像源&#xff0c;将/etc/yum.repos.d/下所有文件备份到/etc/yum.repos.d/bak/下 2、下载阿里云镜像 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 3、清除yum缓存-yum clean all 4、验证镜像源仓库 yum repolist

Redis漏洞复现【vulhub靶场】

步骤一&#xff1a;打开靶场 进入目录:cd /vulhub-master/redis/4-unacc 启动:docker-compose up -d 检查:docker-compose ps 步骤二&#xff1a;打开kali在kali安装redis程序 #安装redis apt-get install redis #redis链接 redis-cli -h 192.168.4.176-p 6379#redis常见命令 (…

智慧合规与合同管理是未来企业竞争力的关键

在法律和市场规则日益完善的当代&#xff0c;企业合规是公司治理的核心。它像是一道紧箍咒&#xff0c;确保企业遵循法律法规&#xff0c;避开违规风险&#xff1b;同时也是一枚护身符&#xff0c;保护企业免受不必要的诉讼和罚款&#xff1b;更加是企业竞争力的体现&#xff0…

使用 Prometheus 和 Grafana 监控 FastAPI 服务

在现代应用开发中&#xff0c;监控和可视化服务的运行状态和性能指标对于保证系统稳定性至关重要。本文将介绍如何使用 Prometheus 和 Grafana 对 FastAPI 服务进行监控和可视化&#xff0c;并展示如何通过 prometheus_fastapi_instrumentator 将 FastAPI 应用与 Prometheus 集…

zabbix监控1

1、概念 自带图形化界面&#xff0c;通过网页就可以监控所有服务器的状态。 事件告警、邮件通知 web界面提供的分布式监控以及网络监控功能的开源的企业级的软件解决方案 zabbix可以提供各种类型的监控模版&#xff0c;保证服务器的正常运行&#xff0c;灵活的通知机制可以…

惠海 H7303 DCDC线性恒流IC PWM调光无电感低压差大电流 9V 12V 24V 30V球泡灯/转向灯方案

H7303是一种带PWM调光功能的线性降压恒流LED驱动器&#xff0c;仅需外接一个电阻就可以构成一个完整的LED恒流驱动电路,调节该外接电阻就可以调节输出电流&#xff0c;输出电流可调范围为16~2000mA。H7303内置过热保护功能&#xff0c;可有效保护芯片&#xff0c;避免因过热而造…

【经验分享】ShardingSphere+Springboot-04:自定义分片算法(COMPLEX/STANDARD)

文章目录 3.4 CLASS_BASED 自定义类分片算法3.4.1 复杂分片自定义算法&#xff08;strategyCOMPLEX &#xff09;3.4.2 STANDARD 标准分片自定义算法## 进阶:star: 自定义算法范围查询优化 3.4 CLASS_BASED 自定义类分片算法 3.4.1 复杂分片自定义算法&#xff08;strategyCOM…

Windows 10 /11 系统上安装Arc浏览器!超详细的教程

Arc浏览器在在发布以后&#xff0c;给人留下了相当不错的第一印象。 简洁的界面设计,巧妙的操作逻辑,使用过后让人爱不释手,体验出众&#xff01;目前官方提供了Windows 11 和 Mac版 官方下载&#xff1a;【链接直达】 如果你是Windows 10系统&#xff0c;由于官方没有直接提…

加固三防笔记本电脑:保护数据安全的首选设备

随着信息技术的飞速发展&#xff0c;笔记本电脑早已成为现代生活中不可或缺的工具。然而&#xff0c;普通的笔记本电脑无法适应一些特殊的环境&#xff0c;在数据安全保护方面也有着一定的风险。加固三防笔记本电脑则是保护数据安全的首选设备。下面将介绍加固三防笔记本电脑的…

掌控150+KOC账号!游戏厂商深掘ChinaJoy余温,热度再飙升!

4天36.7万人次&#xff0c;抖音话题总播放次数达到10.9亿&#xff01; ChinaJoy&#xff08;以下简称CJ&#xff09;官方给出了第21届CJ的参观总人次和线上流量数据&#xff0c;展现了其应有的“顶流”热度。 作为全球数字娱乐领域最具知名度与影响力的年度盛会&#xff0c;202…

springmvc框架 dispacherServelet容器组件调用

服务器启动时&#xff0c;tomcat创建并自动装配所有生成对象&#xff1a;spring容器放在服务器应用全局中&#xff0c;springmvc容器被放在dispacherServlet容器中。注解解析器在dispacherServlet创建时赋予它识别相关注解并作出相应操作的能力。 浏览器发送请求req&#xff0c…

养老院老人健康信息管理系统 /养老院管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

达梦数据库 DMFLDR的使用

达梦的DMFLDR使用 1.背景2.要求3.实验步骤3.1 参数简介3.2 控制文件3.3 数据文件编写3.4 创建表3.5 执行装载程序3.6 查看运行结果3.7 数据导出控制文件编写3.8 数据导出命令3.9 行列分隔符 4.实验结论 1.背景 用户通过使用快速装载工具能够把按照一定格式排序的文本数据以简单…

门店收银系统源码+同城即时零售多商户入驻商城源码

一、我们为什么要开发这个系统&#xff1f; 1. 商户经营现状 “腰尾部”商户&#xff0c;无小程序运营能力&#xff1b;自营私域商城流量渠道单一&#xff1b;无法和线下收银台打通&#xff0c;库存不同步&#xff0c;商品不同步&#xff0c;订单不同步&#xff1b; 2.平台服…

SpringBoot-application.properties为对象赋值

简单对象赋值 第一种方式 首先让该Bean交由Spring管理,然后加上ConfigurationProperties(prefix"前缀") <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>&l…

PCIe学习笔记(19)

TLP Prefix&#xff08;前缀&#xff09;规则 以下规则适用于任何包含TLP Prefix的TLP: •对于任何TLP, TLP第0字节的Fmt[2:0]字段值为100b表示存在TLP Prefix, Type[4]位表示TLP Prefix的类型。 ◦Type[4]位的值为0b表示存在Local TLP Prefix ◦Type[4]位的值为1b表示存在…