shell条件测试

news/2024/4/29 0:04:03/文章来源:https://blog.csdn.net/qq_50589028/article/details/128958723

文章目录

    • 三、shell条件测试
      • 3.1条件测试的基本语法
      • 3.2 文件测试表达式
      • 3.3字符串测试表达式
      • 3.4 整数测试表达式
      • 3.5 逻辑操作符

三、shell条件测试

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

3.1条件测试的基本语法

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

3.2 文件测试表达式

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

①test示例:

[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# test -f file;echo $?
0
[root@localhost test3]# test -f file1;echo $?
1
[root@localhost test3]# test -x file;echo $?
1

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

[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# [ -f file ];echo $?
0
[root@localhost test3]# [ -f file1 ];echo $?
1
[root@localhost test3]# [ -w file ];echo $?
0

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

[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# [[ -f file ]];echo $?
0
[root@localhost test3]# [[ -f file1 ]];echo $?
1
[root@localhost test3]# [[ -x file ]];echo $?
1

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

[root@localhost test3]# echo $filepath 该变量值为空
[root@localhost test3]# test -f $filepath;echo $?
0
[root@localhost test3]# test -f "$filepath";echo $?
1

练习1:让用户输入一个文件名,并做如下判断:
(1)如果用户输入的文件为空时显示:you must input a filename,并中断程序;

(2)如果用户输入的文件不存在时,显示the file do not exist,并中断程序;

(3)如果文件存在,判断该文件的文件类型和执行者对该文件所拥有的的权限。

说明:由于root在很多权限的限制上面都是无效的,所以使用root执行这个脚本时,常常会发现与ls -l的结果不相同。所以建议使用一般用户来执行这个脚本。

read -p "input a filename:" filename
test -z $filename && echo "you must input a filename" && exit 0
test ! -e $filename && echo "the file $filename do not exist" && exit 0
test -f $filename && filetype="regulare file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo "the $filename is a $filetype"
echo "and the permissons are: $perm"

3.3字符串测试表达式

在这里插入图片描述
①test示例

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

②[]示例

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

③[[]]示例

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

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

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

3.4 整数测试表达式

**在这里插入图片描述
注意
=和!=也可在[]中作比较时使用,在[]中也可使用>和<符号,但需要使用反斜线转义,有时不转译虽然语
法不会报错,但是结果可能会不对;

在[[]]中也可使用包含-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

3.5 逻辑操作符

在这里插入图片描述
①test示例

[root@localhost test3]# ll
total 0
drwxr-xr-x. 2 root root 6 Feb 20 11:47 ceshi
-rw-r--r--. 1 root root 0 Feb 20 10:46 file
[root@localhost test3]# test -f file && echo 1 ||echo 0
1
[root@localhost test3]# test -f file1 && echo 1 ||echo 0
0
[root@localhost test3]# ! test -f file;echo $?
1


命令1 && 命令2,如果命令1执行不成功,则命令2不执行。

命令3 || 命令4,如果命令3成功,不执行命令4;如果命令3不成功,则执行命令4

②[]示例

[root@localhost test3]# [ -f ceshi -a -f file ];echo $?
1
[root@localhost test3]# [ -e ceshi -a -f file ];echo $?
0
[root@localhost test3]# [ -f ceshi -o -f file ];echo $?
0
[root@localhost test3]# [ -f ceshi ];echo $?
1
[root@localhost test3]# ! [ -f ceshi ];echo $?
0
[root@localhost test3]# [ ! -f ceshi ];echo $?
0

使用&&等符号的错误示例:

[root@localhost test3]# [ -f ceshi && -f file ];echo $?
-bash: [: missing `]'
2
[root@localhost test3]# [ -f ceshi || -f file ];echo $?
-bash: [: missing `]'
-bash: -f: command not found
127

使用&&等符号的正确示例:

[root@localhost test3]# [ -f file ] && [ -f ceshi ];echo $?
1
[root@localhost test3]# [ -f file ] || [ -f ceshi ];echo $?0
[root@localhost test3]# [ -f file ] || [ -d ceshi ];echo $?
0

③[[]]示例

[root@localhost test3]# [[ -f file && -f ceshi ]];echo $?
1
[root@localhost test3]# [[ -f file || -f ceshi ]];echo $?
0
[root@localhost test3]# [[ -f file && -d ceshi ]];echo $?
0

④(())示例

[root@localhost test3]# ((2>3&&3>4));echo $?
1
[root@localhost test3]# ((2<3&&3<4));echo $?
0

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

[root@localhost test3]# cat ./1.sh
#!/bin/bash
read -p "please input a number:" num
[ "$num" -eq 1 ] && {
echo 1
exit 0
}
[ "$num" -eq 2 ] && {
echo 2
exit 0
}
[ "$num" -ne 1 -a "$num" -ne 2 ] && {
echo error
exit 0
}
[root@localhost test3]# ./1.sh
please input a number:3
error
[root@localhost test3]# ./1.sh
please input a number:1
1
[root@localhost test3]# ./1.sh
please input a number:2
2

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

[root@localhost test3]# cat 2.sh
#!/bin/bash
read -p "please input two number:" a b
[ -z "$a" -o -z "$b" ] && {
echo "please input 'two' number"
exit 1
}
expr $a + 10 &>/dev/null
return_a=$?
expr $b + 10 &>/dev/null
return_b=$?
[ "$return_a" -eq 0 -a "$return_b" -eq 0 ] || {
echo "please input two 'number'"
exit 2
}
[ "$a" -lt "$b" ] && {
echo "$a < $b"
exit 0
}
[ "$a" -eq "$b" ] && {
echo "$a = $b"
exit 0
}
[ "$a" -gt "$b" ] && {
echo "$a > $b"
exit 0
}
[root@localhost test3]# ./2.sh
please input two number:2 4
2 < 4
[root@localhost test3]# ./2.sh
please input two number:6 6
6 = 6

实验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.luyixian.cn/news_show_255827.aspx

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

相关文章

go语言的并发编程

并发编程是 Go语言的一个重要特性,而 go语言也是基于此而设计出来的。 本文将会介绍如何使用go-gc中的“runtime”方法实现 go语言中的并发编程。 在之前的文章中,我们已经对 runtime方法进行了详细介绍,这次文章将对 runtime方法进行深入分析,并讲解如何在go-gc中使用该方…

智能建筑电力监控自动化的解决方案

引言 安科瑞 李亚俊 壹捌柒贰壹零玖捌柒伍柒 所谓智能建筑就是采用计算机技术和通讯技术对建筑的设备进行自动监控&#xff0c;对信息资源进行管理和为用户提供信息服务等。美国智能建筑研究机构把智能建筑定义为&#xff1a;通过对建筑物的结构、系统、服务和管理四个基本要…

数据库模式(schema)是什么?

在数据库的术语中&#xff0c;模式&#xff08;schema&#xff09;是一个逻辑概念&#xff0c;用于组织数据库中的对象。模式中的对象通常包括表、索引、数据类型、序列、视图、存储过程、主键、外键等等。 模式可以为数据库对象提供逻辑隔离功能&#xff0c;不用应用程序可以…

负载均衡下的webshell上传

负载均衡下的webshell上传1.应用场景2.面临的困难2.1 shell文件上传问题2.2 命令执行时的漂移2.3 大工具投放失败2.4 内网穿透工具失效3.一些解决方案3.1 关机3.2 基于IP判断执行主机3.3 脚本实现web层的流量转发3.3.1 创建antproxy.jsp脚本3.3.2 修改 Shell 配置4.总结1.应用场…

开发必看!三分钟读懂Salesforce SOQL查询和限制

SOQL是支持我们与Salesforce数据库交互的查询语言。开发人员在编写Apex时通常会使用到SOQL&#xff0c;此外&#xff0c;它还允许管理员和开发人员从组织内部检索数据并在导出结果时生成强大的数据报告。 SOQL 查询对于编写代码的开发人员&#xff0c;以及通过使用子句扩展查询…

STM32 复用JLink下载线输出调试信息

编写STM32程序时&#xff0c;要输出调试信息的话&#xff0c;一般是通过一个串口输出&#xff0c;电脑端使用串口调试助手显示调试信息。这样的话&#xff0c;就需要占用一个串口资源。还有一种SEGGER的RTT方式&#xff0c;直接使用JLink下载线输出调试信息&#xff0c;这样可以…

在线支付系列【21】微信支付服务商接入前准备

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录项目概述接入准备1. 注册服务商号&#xff08;获取服务商mchid&#xff09;2. 注册公众号&#xff08;获取服务商APPID&#xff09;3. 绑定应用ID和服务商ID4. 入驻子商户&#xff08;特约商户进…

使用Jmeter抓取手机APP报文并进行APP接口测试

Jmeter是一个比较常用的接口测试工具&#xff0c;尤其是接口性能测试。当然它也可以用来测试手机APP的HTTP接口&#xff0c;我在Fiddler抓取手机APP报文 和 接口测试代理工具charles mock测试 分别介绍了Fiddler和charles 如何抓取APP报文&#xff0c;本文介绍使用Jmeter来抓取…

内网渗透(十三)之内网信息收集-收集域环境中的基本信息

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Jmeter之实现参数化的不同方式详解

参数化简介 定义&#xff1a;动态的获取、设置或生成数据&#xff0c;是一种由程序驱动代替人工驱动的数据设计方案&#xff0c;提高脚本的编写效率以及编写质量 适用场景&#xff1a;当提交的数据量较大时&#xff0c;每次修改太麻烦&#xff0c;可以使用参数化 本文介绍实现…

linux yum安装卸载jdk8

1>安装1 yum -y list java* 列出jdk列表2 yum install -y java-1.8.0-openjdk-demo.x86_64&#xff08;安装这个java -version 正常显示&#xff0c;但是javac不能用&#xff0c;因为yum install java 只是安装了java的运行时环境&#xff0c;并不支持编译&#xff0c;安装成…

NLP学习——信息抽取

信息抽取 自动从半结构或无结构的文本中抽取出结构化信息的任务。常见的信息抽取任务有三类&#xff1a;实体抽取、关系抽取、事件抽取。 1、实体抽取 从一段文本中抽取出文本内容并识别为预定义的类别。 实体抽取任务中的复杂问题&#xff1a; 重复嵌套&#xff0c;原文中…

使用openai-whisper 语音转文字

前言&#xff1a;最近由于ChatGPT 的大热&#xff0c;AI 应用领域再次进入大众的视线&#xff0c;今天介绍一款AI应用whisper 可以较为准确的将人声转换为文字&#xff08;支持多国语言&#xff09;一、安装安装有两种方式pip 和源码编译安装&#xff0c;这里介绍pip安装方式安…

欧盟砍伐森林法规和遵守情况 用Dimitra技术解决森林砍伐问题

两千年前&#xff0c;西欧有80%的地区被列为森林。今天&#xff0c;这个数字只有34%。森林砍伐影响着这个星球上的每个人。它造成了大约10%的全球变暖。如果不设法解决森林砍伐问题&#xff0c;就不可能应对全球变暖。 毁林是有目的的清除林地的行为。此外&#xff0c;工业化农…

cmd常用的操作命令

使用windows系统&#xff0c;通常在cmd中输入指令&#xff0c;会调用相应的一些程序或者执行一些功能&#xff0c;学会使用CMD中的命令&#xff0c;可以加快我们一些操作&#xff0c;省时省力。 ipconfig ------查询IP地址 gpedit.msc-----组策略 sndrec32-------录音机 Nsloo…

ClickHouse 合并树表引擎 MergeTree 索引与数据存储方式

目录 1. 一级索引 1.1 稀疏索引 1.2 索引粒度 1.3 索引数据的生成规则 1.4 索引的查询过程 2. 二级索引 2.1 granularity 与 index_granularity 2.2 跳数索引的生成规则

JVM从看懂到看开Ⅲ -- 类加载与字节码技术【上】

文章目录类文件结构魔数版本常量池访问标识与继承信息Field 信息Method 信息附加属性字节码指令初识javap工具图解方法执行流程通过字节码指令来分析分析 i问题条件判断指令循环控制指令构造方法cinit()Vinit()V方法调用多态原理异常处理try-catch多个single-catchfinallyfinal…

MDQ60-16-ASEMI三相整流模块MDQ60-16

编辑-Z MDQ60-16在MDQ封装里采用的4个芯片&#xff0c;是一款机床用三相可控整流模块。MDQ60-16的浪涌电流Ifsm为920A&#xff0c;漏电流(Ir)为5mA&#xff0c;其工作时耐温度范围为-40~150摄氏度。MDQ60-16采用GPP硅芯片材质&#xff0c;里面有4颗芯片组成。MDQ60-16的电性参…

TCP连接的状态详解以及故障排查(五)

同时打开 两个应用程序同时执行主动打开的情况是可能的&#xff0c;虽然发生的可能性较低。每一端都发送一个SYN,并传递给对方&#xff0c;且每一端都使用对端所知的端口作为本地端口。例如&#xff1a; 主机a中一应用程序使用7777作为本地端口&#xff0c;并连接到主机b 888…

WebDAV之葫芦儿·派盘+KMPlayer

KMPlayer 支持WebDAV方式连接葫芦儿派盘。 KMPlayer几乎可以播放您系统上所有的影音文件,支持几乎全部音视频格式。通过其强大的插件功能,可以支持层出不穷的新格式。软件还具有齐全的操控功能,支持捕获音频、捕获AVI、捕获画面、外挂字幕、自定义编辑设置,是视频爱好者的不…