Linux_shell脚本if语句详细教程

前言

在 Linux Shell 脚本中,if 语句用于基于条件执行命令或代码块。它的基本语法结构如下:

if 条件; then# 如果条件为真时执行的代码
elif 另一个条件; then# 如果另一个条件为真时执行的代码
else# 如果所有条件都不成立时执行的代码
fi

一、if 语句中 &&、|| 和 ! 的使用方法

1、&& (逻辑与)

  • && 用于连接两个命令,当左边的命令成功(即返回值为0)时,右边的命令才会执行。
# 语法结构:
if 条件一 && 条件二; thenecho "条件一和条件二都执行成功"
elseecho "条件一或条件二有失败"
fi

逻辑:

  • 如果 条件一 成功(返回值为 0)且 条件二 也成功(返回值为 0),then 分支会执行。
  • 如果 条件一 失败(返回非 0),或者 条件二 失败(返回非 0),else 分支会执行。

这个规则是基于“与”运算符:只有两个条件都成功,then 才会执行。

# 场景示例:检查一个文件是否存在且可执行
#!/bin/bashFILE="/home/user/file.sh"# [ ] 写法
if [ -e "$FILE" ] && [ -x "$FILE" ]; thenecho "[: 文件存在且可执行"
elseecho "[: 文件不存在或不可执行"
fi# [[ ]] 写法 
if [[ -e "$FILE" && -x "$FILE" ]]; thenecho "[[: 文件存在且可执行"
elseecho "[[: 文件不存在或不可执行"
fi

2、|| (逻辑或)

  • || 用于连接两个命令,当左边的命令失败(即返回值不为0)时,右边的命令才会执行
# 语法结构:
if 条件一 || 条件二; thenecho "条件一或条件二执行成功"
elseecho "条件一和条件二都执行失败"
fi

逻辑:

  • 如果 条件一 成功(返回值为 0),then 分支会执行。
  • 如果 条件一 失败(返回非 0),则会检查 条件二:
      如果 条件二 成功(返回值为 0),then 分支也会执行。
      如果 条件一 和 条件二 都失败(返回非 0),则会执行 else 分支。

这个规则是基于“或”运算符:只要有一个条件成功,then 就会执行。

# 场景示例:检查目录是否存在,如果不存在则创建
#!/bin/bashDIR="/home/user/mydir"if [[ -d "$DIR" ]] || mkdir "$DIR" > /dev/null 2>&1; thenecho "目录已存在或已成功创建"
elseecho "创建目录失败"
fi

3、! (逻辑非)

  • ! 用于对一个条件进行取反。如果条件为真,! 会使其为假,反之亦然。
# 语法结构:
if ! 条件一; thenecho "条件一假,取反真"
elseecho "条件一真,取反假"
fi

在这里插入图片描述

# 示例
#!/bin/bashif [ ! -f "file.txt" ]; thenecho "文件不存在"
elseecho "文件存在"
fi

在这里插入图片描述

#!/bin/bash# ! 与 && 配合使用
if [ ! -f "file.txt" ] && echo "假如条件二成功"; thenecho "条件一(文件不存在,取反真)和条件二都执行成功"
elseecho "条件一(文件存在,取反假)或条件二有失败"
fi

二、检查文件和文件夹方法

1、判断文件是否存在 -f

#!/bin/bash# 获取当前脚本文件所在的目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)# 设置要检查的文件名
file="${SCRIPT_DIR}/example.txt"
echo ${file}# 判断文件是否存在
if [ -f "$file" ]; thenecho "$file 文件存在"
elseecho "$file 文件不存在"
fi

2、判断文件夹(目录)是否存在 -d

# 设置要检查的目录名
dir="/home/user/myfolder"# 判断目录是否存在
if [ -d "$dir" ]; thenecho "$dir 目录存在"
elseecho "$dir 目录不存在"
fi
其它参数说明
-e检查文件或目录是否存在(不管是文件还是目录)
-r检查文件是否可读(非root权限下才能获取正确)
-w检查文件是否可写(非root权限下才能获取正确)
-x检查文件是否可执行(非root权限下才能获取正确)

三、字符串比较、数值比较及算术比较

1.整数数值对比

数值比较参数说明
-lt表示 “less than”(小于)
-eq表示 “equal to”(等于)
-ne表示 “not equal to”(不等于)
-gt表示 “greater than”(大于)
-ge表示 “greater than or equal to”(大于或等于)
-le表示 “less than or equal to”(小于或等于)

示例

#!/bin/basha=2
b=2if [[ $a -eq $b ]]; thenecho "$a 等于 $b"
elseecho "$a 不等于 $b"
fi

2.字符串对比

字符串比较参数说明
==字符串相等
!=字符串不相等

示例

#!/bin/basha="abcdef"
b="abcde"# 比较字符串是否相等
if [[ $a == $b ]]; thenecho "字符串 '$a' 和 '$b' 相等"
elseecho "字符串 '$a' 和 '$b' 不相等"
fi# 比较字符串是否不相等
if [[ $a != $b ]]; thenecho "字符串 '$a' 和 '$b' 不相等"
elseecho "字符串 '$a' 和 '$b' 相等"
fi

3、算术比较

算术比较参数说明
<小于
==等于
!=不等于
>大于
>=大于或等于
<=小于或等于
#!/bin/bashnum1=5
num2=5if (( num1 == num2 )); thenecho "${num1}${num2} 相等"
elseecho "${num1}${num2} 不相等"
fia=10
b=1if (( (a + b) > 10 )); thenecho "a 和 b 的和大于 10"
fi

在这里插入图片描述


四、检查命令的退出状态

#!/bin/bash# 执行某个命令
ls /home > /dev/null 2>&1# 判断命令是否成功
if [ $? -eq 0 ] ; thenecho "命令执行成功"
elseecho "命令执行失败"
fi# $? 存储的是上一个命令的退出状态。
# 退出状态 0 通常表示命令成功执行,其他非零值表示命令执行失败。

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

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

相关文章

Python自学之Colormaps指南

目录 1.色彩映射表&#xff08;Colormaps&#xff09;是什么&#xff1f; 2.Matplotlib中的色彩映射表类型 2.1同色渐变&#xff08;Sequential Colormaps&#xff09; 2.2双色渐变&#xff08;Divergence Colormaps&#xff09; 2.3定性色彩&#xff08;Qualitative Col…

PostgreSQL高可用Patroni安装(超详细)

目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求&#xff1a; 要求在任务截止日期的前3天时&#xff0c;系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单&#xff0c;没有使用消息列队&#xff0c;也不能使用延时队列来做。 用Timer的话开销还挺大的&a…

ubuntu下怎么设置机器程序开机自启?

在 Ubuntu 中&#xff0c;可以通过多种方法设置程序或脚本在系统启动时自动运行。以下是几种常见方法&#xff1a; 方法 1&#xff1a;使用 crontab crontab 是一个定时任务管理工具&#xff0c;可以用来设置程序在开机时自动运行。 1. 打开终端&#xff0c;编辑当前用户的 …

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

大数据学习16之Spark-Core

1. 概述 1.1.简介 Apache Spark 是专门为大规模数据处理而设计的快速通用的计算引擎。 一种类似 Hadoop MapReduce 的通用并行计算框架&#xff0c;它拥有MapReduce的优点&#xff0c;不同于MR的是Job中间结果可以缓存在内存中&#xff0c;从而不需要读取HDFS&#xff0c;减少…

TDSQL 免密码登录

需求 os用户免密登录tdsql 解决方案 使用mysql自带的 mysql_config_editor 工具 提示&#xff1a;使用这个工具&#xff0c;登录密码不能包含#字符。 操作步骤 建os账号&#xff0c;切换到新账号 [roottdsql1 ~]# useradd jdbc_user [roottdsql1 ~]# su - jdbc_user [jd…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

某某科技笔试题

&#xff08;15题&#xff0c;45分钟&#xff0c;闭卷&#xff09; 一、( 8 分 &#xff09;请问以下程序输出什么结果&#xff1f; char *getStr(void) 。 &#xff5b; char p[] "hellow world"; return p; &#xff5d; void test(void) &#xff5b; ch…

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

跨越网络边界:IPv6与零信任架构的深度融合

2024年&#xff0c;工信部发布了《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》&#xff0c;加速了国内网络由IPv4向IPv6的转型步伐。未来&#xff0c;各行各业将逐步去NAT&#xff0c;逐步向IPv6迁移。在此过程中&#xff0c;网络安全解决方案和产品能力将面…

从大数据到大模型:现代应用的数据范式

作者介绍&#xff1a;沈炼&#xff0c;蚂蚁数据部数据库内核负责人。2014年入职蚂蚁&#xff0c;承担蚂蚁集团的数据库架构职责&#xff0c;先后负责了核心链路上OceanBase&#xff0c;OceanBase高可用体系建设、NoSQL数据库产品建设。沈炼对互联网金融、数据库内核、数据库高可…

vue3 + vite + ts 配置 @ 别名

第一步 npm install types/node -D第二步 这是原 vite.config.ts文件import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()], })改成下面这个import { defineConfig } from vite …

Android Framework AMS面试题及参考答案

目录 什么是 AMS? AMS 在 Android 系统中的作用? AMS 是如何启动的? Zygote、SystemServer 与 AMS 之间的关系? AMS 如何与其他系统服务(如 PackageManagerService、WindowManagerService、WMS)交互? AMS 如何使用 Binder 完成通信? AMS 如何管理系统服务的启动…

从零开始学习 sg200x 多核开发之 eth0 dhcpc 配置

前面已经介绍过 sophpi 的启动过程和 eth0 静态 IP 地址配置。不过静态 IP 在使用的时候比较不通用&#xff0c;本文介绍 eth0 自动使能并配置 dhcp 功能。 udhcpc udhcpc 是 BusyBox 工具集中的一个组件&#xff0c;用于从 DHCP 服务器获取网络配置信息&#xff0c;如 IP 地…

开源vs闭源:你更看好哪一方?

开源vs闭源:你更看好哪一方? 引言 你有没有想过,在当今人工智能(AI)蓬勃发展的时代,开源大模型与闭源大模型之间的竞争竟然如此激烈?这仿佛就像是两位骑士在同一片战场上,争夺你我心目中“最强武器”的荣耀。在这场有趣又复杂的较量中,数据隐私、商业应用与社区参与…

华为eNSP:MSTP

一、什么是MSTP&#xff1f; 1、MSTP是IEEE 802.1S中定义的生成树协议&#xff0c;MSTP兼容STP和RSTP&#xff0c;既可以快速收敛&#xff0c;也提供了数据转发的多个冗余路径&#xff0c;在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…

利用python 检测当前目录下的所有PDF 并转化为png 格式

以下是一个完整的 Python 脚本&#xff0c;用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式&#xff1a; import os from pdf2image import convert_from_path# 设置输出图像的 DPI&#xff08;分辨率&#xff09; DPI 300# 获取当前目录 current_directory os…