shell条件测试

news2024/11/25 22:54:00

文章目录

    • 三、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.coloradmin.cn/o/333293.html

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

相关文章

java rpc框架 中的自定义异常类型的全局处理

– 这里的dubbo 可泛指 所有rpc框架 –比如自定义异常类型是MyEx, 以及myEx可以转化为MyResult – 需求: 凡是请求链路中抛出的MyEx需要自动及时或最终转化为 自定义的MyResult返回 – 1. spring 提供 controller端的全局异常捕获. 这一步简单 – 2. dubbo 需要 将MyEx 传输回来…

【子网划分】求子网网络前缀、子网地址、每个子网可以分配给主机使用的最小地址和最大地址

1、某单位分配到一个地址块152.7.77.0/24&#xff0c;现在需要进一步划分为4个一样大的子网。&#xff08;10分&#xff09; 问题&#xff1a; (1) 每个子网的网络前缀有多长&#xff1f; (2) 每一个子网中有多少个地址&#xff1f; (3) 每一个子网的网络地址是什么&#xff1f…

Python实现贝叶斯优化器(Bayes_opt)优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…

Linux基本功系列之sort命令实战

文章目录前言一. sort命令介绍二. 语法格式及常用选项三. 参考案例3.1 按照文本默认排序3.2 忽略相同的行3.3 按数字大小进行排序3.4 检查文件是否已经按照顺序排序3.5 将第3列按照数字大小进行排序3.6 将排序结果输出到文件四. 探讨 -k的高级用法总结前言 大家好&#xff0c;…

python设计模式-享元设计模式,抽象工厂设计模式,面向对象设计模式

享元设计模式 享元(flyweight)设计模式属于结构设计模式类别。 它提供了一种减少对象数的方法。 它包含各种有助于改进应用程序结构的功能。享元对象最重要的特性是不可变的。 这意味着一旦构建就不能修改它们。 该模式使用HashMap来存储引用对象 如何实现享元(flyweight)设计…

【个人作品】非侵入式智能开关

一、产品简介 一款可以通过网络实现语音、APP、小程序控制&#xff0c;实现模拟手动操作各种开关的非侵入式智能开关作品。 非侵入式&#xff0c;指的是不需要对现有的电路和开关做任何改动&#xff0c;只需要将此设备使用魔术无痕胶带固定在旁边即可。 以下为 ABS 材质的渲…

你知道 BI 是什么吗?关于 BI 系统的概述

BI 作为信息化建设中的关键一环&#xff0c;在企业中通常起到承上启下的作用&#xff0c;下能连接打通企业业务系统数据库&#xff0c;将各部门数据分类分级统一储存到数据仓库&#xff0c;简化存储取数流程&#xff0c;减少人力、时间成本&#xff1b;上能提供数据可视化报表…

Elasticsearch安装IK分词器、配置自定义分词词库

一、分词简介 在Elasticsearch中&#xff0c;假设搜索条件是“华为手机平板电脑”&#xff0c;要求是只要满足了其中任意一个词语组合的数据都要查询出来。借助 Elasticseach 的文本分析功能可以轻松将搜索条件进行分词处理&#xff0c;再结合倒排索引实现快速检索。Elasticse…

你是什么时候从轻视到高看软件测试的?

刚开始学软件测试很轻视&#xff0c;因为我那时很无知&#xff0c;这也是那时绝大多数人员的心态&#xff0c;那时中国最讲究“编程才是硬道理”。 如今却非常热爱软件测试&#xff0c;包括软件测试工具&#xff0c;方法&#xff0c;理论&#xff0c;技术。因为我在3年的测试工…

NLP学习——信息抽取

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

虚拟机磁盘重新分区增加Docker磁盘空间

目录一、简介二、重新分区 挂载目录2.1 增加虚拟机硬盘空间2.2 重新分区2.3 格式化新分区2.4 挂载docker目录三、重新拉取一、简介 今天在使用docker pull 拉取镜像时&#xff0c;报了no such file or directory的信息&#xff0c;原来是Docker的磁盘空间满了 #查看Docker Roo…

跳跃游戏 II 解析

题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - 1] 的…

推荐一个前后端分离.NetCore+Angular快速开发框架

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一个开源项目&#xff0c;基于.NetCore开发的、前后端分离、前端有Vue、Angular、MVC多个版本的快速开发框架。 项目简介 这是一个基于.NetCore开发的快速开发框架&#xff0c;项目采用模块化架…

go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket

一个基于go-zero框架的微服务影院票务系统cinema-ticket 前言 项目基本介绍 项目开源地址&#xff1a;butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统&#xff0c;基于go-zero框架实现&#xff0c…

Monkey

文章目录一、简介二、原理2.1 特殊处理三、命令3.1 启动3.2 关闭四、事件4.1 触摸事件4.2 手势事件4.3 二指缩放事件4.4 轨迹事件4.5 屏幕旋转事件4.6 基本导航事件4.7 主要导航事件4.8 系统按键事件4.9 启动activity事件4.10 键盘事件4.11 其他类型事件五、参数5.1 常规类参数…

ThreadLocal原理、内存泄漏的验证

文章目录前言正文1、ThreadLocal 的常见使用场景2、从ThreadLocal的源码开始2.1 ThreadLocalMap2.2 ThreadLocalMap的 set 方法2.3 ThreadLocalMap的 remove 方法2.4 ThreadLocal 的 set 方法2.5 ThreadLocal 的 remove 方法3、内存泄漏3.1 内存泄漏的概念3.2 为什么说entry的k…

《唐诗三百首》数据源网络下载

2023年的 元宵之夜&#xff0c;这场以“长安”为主题的音乐会火了&#xff01;在抖音&#xff0c;超过2300万人次观看了直播&#xff0c;在线同赏唐诗与交响乐的融合。许多网友惊呼&#xff0c;上学时那些害怕背诵的诗句&#xff0c;原来还可以有这么美的表达这场近80分钟的音乐…

【dapr】服务调用(Service Invokation) - app id的解析

逻辑图解 上图来自Dapr官网教程&#xff0c;其中Checkout是一个服务&#xff0c;负责生成订单号&#xff0c; Order Processor是另一个服务&#xff0c;负责处理订单。Checkout服务需要调用Order Processor的API&#xff0c; 让Order Processor获取到其生成的订单号并进行处理。…

Chapter4:机器人仿真

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…

打造安全可信的通信服务,阿里云云通信发布《短信服务安全白皮书》

随着数字化经济的发展&#xff0c;信息保护和数据安全成为企业、个人关注的焦点。近日&#xff0c;阿里云云通信发布《短信服务安全白皮书》&#xff0c;该白皮书包含安全责任共担、安全合规、安全架构三大板块&#xff0c;呈现了阿里云云通信在信息安全保护方面的技术能力、安…