SHELL笔记(条件测试)

基本概念:

  • 条件测试用于在 Shell 脚本中对各种条件进行判断,根据判断结果来决定是否执行特定的命令或代码块。
  • 条件测试可以用于比较数值、字符串,检查文件或目录的属性,以及判断命令的执行结果等。

格式:

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

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

  • test与[ ]等价

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

  • (()) 一般用于if语句里,两端不需要有空格,测试对象为整数

 文本测试:

参数作用
-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旧则为真(根据文件修改时间计算)

示例: 

if [ -d /tmp/mydir ]; thenecho "/tmp/mydir exists and is a directory"
fi

 

整数测试:

  • 比较运算符:
    • -eq:等于,用于判断两个数值是否相等。
    • -ne:不等于,判断两个数值是否不相等。
    • -gt:大于,检查左边的数值是否大于右边的数值。
    • -lt:小于,判断左边的数值是否小于右边的数值。
    • -ge:大于等于,左边的数值大于等于右边的数值时条件为真。
    • -le:小于等于,左边的数值小于等于右边的数值时条件成立。

示例:

num1=5
num2=3
if [ $num1 -gt $num2 ]; thenecho "$num1 is greater than $num2"
fi

 

 逻辑操作符:

示例: 

[root@server ~]# [ -f /etc/passwd  -a -f /etc/services ] && echo  1 || echo 0
1[root@server ~]# [ -f /etc/hosts  -o  -d /etc/services ] && echo  1 || echo 0
1[root@server ~]# ((5<10 && 5>2))  && echo y || echo n
y

 命令分隔符

格式:

cmd1;cmd2     以独立的进程依次执行cmd1和cmd2

# 示例 1:先创建一个测试目录,然后在该目录下创建一个空文件
mkdir test_dir; touch test_dir/test_file.txt# 示例 2:先输出一条信息,再查看当前目录下的文件列表
echo "准备查看文件列表" ; ls# 解释:
# 在这两个例子中,分号 `;` 起到了分隔两个命令的作用,命令会按照先后顺序依次执行。
# 第一个命令执行完毕后,无论其执行结果如何(成功或失败),都会接着执行第二个命令。
# 它们是在独立的进程中执行的,每个命令的执行环境相对独立。

(cmd1;cmd2)   在同一进程中依次执行cmd1和cmd2

# 示例 1:在同一个子 Shell(可以理解为同一进程的一个特定执行环境)中,先切换目录,再列出该目录下文件
(cd /etc; ls)# 示例 2:在同一个进程环境下,先设置一个临时环境变量,然后输出该变量的值
(name="John"; echo $name)# 解释:
# 使用圆括号将两个命令括起来,这两个命令会在同一个子 Shell 也就是同一个进程环境里依次执行。
# 以第一个示例来说,执行完 `cd /etc` 切换目录后,后续的 `ls` 命令能基于切换后的目录来列出文件内容,它们共享同一个进程的上下文环境,比如工作目录、部分环境变量等设置。
# 与 `cmd1;cmd2` 的区别在于执行环境的关联性更强,是在同一个进程内完成先后操作。

cmd1&cmd2     cmd1和cmd2同时执行,分属于不同的进程

# 示例 1:一边在后台运行一个长时间的文件查找命令(模拟耗时操作),一边继续执行其他命令(这里输出一条提示信息)
find / -name "*.log" & echo "文件查找已在后台启动,现在可以继续做别的事啦"# 示例 2:在后台启动一个服务(这里以简单的模拟启动一个 sleep 进程代表服务启动,实际可以替换为真实服务启动命令),同时执行另一个无关操作(输出当前时间)
sleep 100 & date# 解释:
# `&` 符号使得两个命令同时开始执行,各自在不同的进程中运行。
# 这样可以充分利用系统资源,让耗时较长的命令在后台运行不影响其他命令的执行。
# 例如在第一个示例中,`find` 命令去遍历整个根目录查找 `.log` 文件可能需要较长时间,通过 `&` 让它在后台运行,同时可以输出提示信息告知用户,用户可以继续输入其他命令操作,无需等待 `find` 命令执行完。

cmd1&&cmd2    当cmd1为真时,则执行cmd2

# 示例 1:先判断一个文件是否存在,如果存在则输出其内容
[ -f test.txt ] && cat test.txt# 示例 2:先检查某个软件包是否已安装(这里以简单的判断命令是否存在代表,实际可根据具体包管理命令来准确判断),如果安装了则运行该软件
which firefox && firefox# 解释:
# 这里利用了 Shell 中命令执行成功返回 `0`(即条件为真),执行失败返回非 `0`(条件为假)的特性。
# 在第一个示例中,只有当 `[ -f test.txt ]` 这个判断文件是否存在的命令返回 `0`(也就是文件确实存在)时,才会接着执行 `cat test.txt` 命令去输出文件内容;如果文件不存在,`[ -f test.txt ]` 返回非 `0`,则不会执行 `cat test.txt`。
# 第二个示例同理,只有 `which firefox` 能找到 `firefox` 命令(意味着软件已安装)返回 `0` 时,才会接着启动 `firefox` 软件。

cmd1||cmd2    当cmd1不为真时,则执行cmd2

# 示例 1:先尝试使用 `ping` 命令去 ping 一个可能不存在的主机(这里模拟),如果 ping 不通(命令返回非 `0`),则输出提示信息表示无法连接
ping 192.168.1.200 || echo "无法连接到指定主机"# 示例 2:先尝试查找某个配置文件,如果找不到(命令返回非 `0`),则创建一个默认的配置文件(这里简化为创建一个空文件代表)
[ -f config.ini ] || touch config.ini# 解释:
# 同样基于命令执行的返回状态进行判断。在第一个示例中,若 `ping` 命令执行失败(比如目标主机不存在或者网络不通等原因导致无法 ping 通),即返回非 `0`,此时就会执行 `echo "无法连接到指定主机"` 命令来输出相应提示信息。
# 在第二个示例中,如果 `[ -f config.ini ]` 判断配置文件不存在(返回非 `0`),就会执行 `touch config.ini` 命令去创建一个配置文件,以此实现一种简单的错误处理或者默认配置创建逻辑。

cmd&          后台执行

# 示例 1:将一个无限循环脚本(这里只是简单示例,模拟一个持续运行的后台任务)放到后台执行,这样终端可以继续输入其他命令操作
while true; do echo "后台任务运行中..."; sleep 1; done &# 示例 2:后台启动一个长时间运行的文件压缩任务(这里简化为模拟耗时操作,实际可替换为真实的压缩命令如 `tar` 等)
tar -czf large_file.tar.gz large_file &# 解释:
# `&` 符号单独放在命令后面,作用就是让这个命令在后台运行,使得终端不会被该命令长时间占用,可以继续执行其他的命令操作。
# 例如在第一个示例中,那个无限循环会不断输出信息,但放在后台后,终端不会一直显示这些循环输出的内容,用户还可以输入其他命令与系统交互,同时这个后台任务会持续运行。
# 第二个示例里的文件压缩任务往往比较耗时,通过 `&` 让它在后台执行,方便用户在压缩过程中去做其他事情。

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

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

相关文章

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…

微信小程序-prettier 格式化

一.安装prettier插件 二.配置开发者工具的设置 配置如下代码在setting.json里&#xff1a; "editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml"…

【Mac】未能完成该操作 Unable to locate a Java Runtime

重生之我做完产品经理之后回来学习Data Mining Mac打开weka.jar报错"未能完成该操作 Unable to locate a Java Runtime" 1. 打开终端执行 java -version 指令&#xff0c;原来是没安装 JDK 环境 yyzccnn-mac ~ % java -version The operation couldn’t be comple…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

【WPF】Prism学习(五)

Prism Commands 1.错误处理&#xff08;Error Handling&#xff09; Prism 9 为所有的命令&#xff08;包含AsyncDelegateCommand&#xff09;提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…

【element-tiptap】Tiptap编辑器核心概念----结构篇

core-concepts 前言&#xff1a;这篇文章来介绍一下 Tiptap 编辑器的一些核心概念 &#xff08;一&#xff09;结构 1、 Schemas 定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema&#xff0c;…

2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索

Enhancing Medical Image Retrieval with UMLS-Integrated CNN-Based Text Indexing 问题 医疗图像检索中&#xff0c;图像与相关文本的一致性问题&#xff0c;如患者有病症但影像可能无明显异常&#xff0c;影响图像检索系统准确性。传统的基于文本的医学图像检索&#xff0…

初识Linux · 信号处理 · 续

目录 前言&#xff1a; 可重入函数 重谈进程等待和优化 前言&#xff1a; 在前文&#xff0c;我们已经介绍了信号产生&#xff0c;信号保存&#xff0c;信号处理的主题内容&#xff0c;本文作为信号处理的续篇&#xff0c;主要是介绍一些不那么重要的内容&#xff0c;第一个…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

【算法】【优选算法】前缀和(下)

目录 一、560.和为K的⼦数组1.1 前缀和1.2 暴力枚举 二、974.和可被K整除的⼦数组2.1 前缀和2.2 暴力枚举 三、525.连续数组3.1 前缀和3.2 暴力枚举 四、1314.矩阵区域和4.1 前缀和4.2 暴力枚举 一、560.和为K的⼦数组 题目链接&#xff1a;560.和为K的⼦数组 题目描述&#x…

两大新兴开发语言大比拼:Move PK Rust

了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野&#xff0c;发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…

Scaling Law的“终结“还是新起点?——开源实践者的深度思考

作者&#xff1a;宋大宝&#xff0c;与大宝同学因那篇《回顾总结展望「融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI」》结识于今年春天&#xff0c;虽我们当时某些思想观念有些出入&#xff0c;也碰撞出了很多火花与共鸣&#xff0c;并持续地相互启发的走到了现在。他是…

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

Ubuntu 的 ROS 操作系统 turtlebot3 导航仿真

引言 导航仿真是机器人自动化系统中不可或缺的一部分&#xff0c;能够帮助开发者在虚拟环境中测试机器人在复杂场景下的运动与路径规划。 在 Gazebo 仿真环境中&#xff0c;TurtleBot3 配合 ROS 操作系统提供了强大的导航功能。在进行导航仿真时&#xff0c;首先需要准备地图&…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…

本草纲目数字化:Spring Boot在中药实验管理中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中药实验管理系统的相关信息成为必然。开发…

无人机挂载超细干粉灭火装置技术详解

无人机挂载超细干粉灭火装置技术是一种创新的灭火方式&#xff0c;结合了无人机的远程操控能力和超细干粉灭火剂的高效灭火性能。以下是对该技术的详细解析&#xff1a; 一、技术背景与原理 背景&#xff1a;高层建筑灭火救援困难一直是公认的世界性难题。无人机技术的发展为…