【Linux】结构化命令:if-then语句

结构化命令structured command:允许脚本根据条件跳过部分命令,改变执行流程。

1、if-then语句

格式1:

if command

then

   commands

fi

格式2:

if command; then

   commands

fi

运行if之后的command命令,如果它的退出状态码是0(该命令成功执行),那么就执行then里面的命令;如果是其它值,则执行脚本中的下一条命令。fi语句用来表示if-then语句到此结束。

#!/bin/bash
if pwd
thenecho "查看当前路径成功!"
fi

 

2、if-then-else语句

格式:

if command

then

   commands

else

   commands

fi 

3、嵌套if语句

 通过使用嵌套的if语句,可以在shell脚本中检查多种条件

#!/bin/bash
testuser=ln
if grep $testuser /etc/passwd
thenecho "用户$testuser存在。"echo
elseecho "用户$testuser不存在。"if ls -d /home/$testuser/thenecho "但是该用户有个路径。"fi
fi
echo "脚本运行完毕!"

4、elif语句

格式:

if command1

then

   commands

elif command2

then

   commands

fi

#!/bin/bash
testuser=ln
if grep $testuser /etc/passwd
thenecho "用户$testuser存在。"echo
elif ls -d /home/$testuser/
thenecho "用户$testuser不存在。"echo "但是该用户有个路径。"
fi
echo "脚本运行完毕!"

5、test命令

test命令可以在if-then语句中测试不同的条件,如果test命令中列出的条件成立,那么test命令就会退出并返回退出状态码0;若条件不成立,test命令就会退出并返回非0的退出状态码。

格式:test condition

if test condition

then

   commands

fi

 如果不写test命令的condition条件,那它会以非0的退出状态码退出并执行else部分的代码块。

#!/bin/bash
if test
thenecho "111"
elseecho "222"
fi

 加上test命令的condition条件

#!/bin/bash
var1="Full"if test $var1
thenecho "111"
elseecho "222"
fi

 如果test命令的condition返回非0退出状态码

#!/bin/bash
var1=""if test $var1
thenecho "111"
elseecho "222"
fi

6、使用方括号代替test命令

可以通过使用方括号定义测试条件注意:第一个方括号之后和第二个方括号之前必须留有空格,否则会报错。 

格式:

if [ condition ]

then

   commands

fi

test命令中的condition和测试条件里的condition可以判断如下3类条件:

  1. 数值比较
  2. 字符串比较
  3. 文件比较

数值比较

常见数值比较如下表格所示:

n1 -eq n2equal,是否等于
n1 -ne n2not equal,是否不等于
n1 -gt n2greater than,是否大于
n1 -lt n2less than,是否小于
n1 -le n2less equal,是否等于小于
n1 -ge n2greater equal,是否大于等于
#!/bin/bash
var1=10
var2=9if [ $var1 -gt 10 ]
thenecho "good!"
elseecho "not good!"
fiif [ $var1 -eq $var2 ]
thenecho "它们相等!"
elseecho "它们不等!"
fi

 字符串比较

字符串比较
str1 = str2检查str1是否和str2相同
str1 != str1检查str1是否和str2不同
str1 < str2检查str1是否小于str2
str1 > str2检查str1是否大于str2
-n str1检查str1的长度是否不为0
-z str1检查str1的长度是否为0

在比较字符串的相等性时,比较测试会将所有的标点大小写都考虑在内。 

#!/bin/bash
#字符串相等或不等
test=ning
if [ $test = ning ]
thenecho "111"
elseecho "222"
fiif [ $test != Ning ]
thenecho "333"
elseecho "444"
fi

在比较字符串的大小时,大于号、小于号必须转义,否则shell会将它们看成重定向符号,将字符串的值当做文件名;另外,大于和小于顺序与sort命令所采用的不同。

 在比较测试中,大写字母是小于小写字母的,但sort则相反,当你使用sort排序时,小写字母会排在前面。这是因为在比较测试中,使用的是Unicode顺序,根据每个字符的Unicode编码值来决定排序结果;sort命令使用的是系统语言环境设置中定义的排序顺序,对于英语,语言设置环境指定了小写字母在大写字母之前。

#!/bin/bash
#字符串的大于小于比较
test=yue
test1=ning
if [ $test \> $ning ]
thenecho "111"
elseecho "222"
fi#字符串的大小写比较
var1=Ning
var2=ning
if [ $var1 \> $var2 ]
thenecho "333"
elseecho "444"
fi

字符串大小

空变量和未初始化的变量会对shell脚本测试造成灾难性的影响,如果不确定变量的内容,最好在将其用于数值或字符串比较之前先通过 -n-z 来判断一下变量是否为空。

#!/bin/bash
string1="yue"
string2=""#判断string1的长度是否不为0
if [ -n $string1 ]
thenecho "111"
elseecco "222"
fi#判断string2的长度是否为0
if [ -z $string2 ]
thenecho "333"
elseecho "444"
fi#判断未定义的string3的长度是否为0
if [ -z $string3 ]
thenecho "555"
elseecho "666"
fi

文件比较

文件比较是shell编程中最为强大且使用最多的比较形式,它允许测试Linux文件系统中文件和目录的状态。

文件比较功能
-d file检查file是否存在且为目录
-e file检查file是否存在
-f file检查file是否存在且为文件
-r file检查file是否存在且可读
-s file检查file是否存在且非空
-w file检查file是否存在且可写
-x file检查file是否存在且可执行
-O file检查file是否存在且属于当前用户所有
-G file检查file是否存在且默认组与当前用户相同
file -nt file2检查file1是否比file2新(比较创建日期)
file -ot file2检查file1是否比file2旧(比较创建日期)
#!/bin/bash
#举例:检查指定对象是否为文件
object_name=$HOME
echo
echo "目标已经确认:$object_name."
echoif [ -e $object_name ]
thenecho "目标存在!"if [ -f $object_name ]thenecho "目标不仅存在,而且还是个文件。"elseecho "目标存在,但它是目录,不是文件。"fielseecho "目标不存在!"
fi

比较两个文件的创建日期时,-nt-ot 都不会先检查文件是否存在,所以为了防止这一点,在比较前可以先判断两个文件是否已存在。 

#!/bin/bash
#比较两个文件的创建日期if [ $HOME/Downloads/test1.sh -nt $HOME/Downloads/test2.sh ]
thenecho "test1.sh更新!"
elseecho "test2.sh更新!"
fi

7、布尔逻辑

可以使用布尔逻辑将多个测试条件组合起来。

[ condition1 ] && [ condition2 ]

[ condition1 ] || [ condition2 ]

#!/bin/bash
# 检查$HOME目录是否存在,且在该目录下是否存在有名为tesh.sh的文件,并且还有该文件的写权限。
if [ -d $HOME ] && [ -w $HOME/test.sh ]
thenecho "你有该文件的写权限。"
elseecho "不能对该文件进行写操作。"
fi

8、if-then的高级特性

  1.  在子shell中执行命令的单括号
  2. 用于数学表达式的双括号
  3. 用于高级字符串处理功能的双方括号

使用单括号

格式:(command)

在bash shell执行command之前,会先创建一个子shell,然后在其中执行命令。如果命令成功结束,则退出状态码会被设为0,接着执行then部分的代码块,反之,退出状态码不为0,则执行else代码块。

#!/bin/bash
echo $BASH_SUBSHELL #是在当前shell中执行的,输出结果是0,表明未使用子shellif (echo $BASH_SUBSHELL) #在子shell中执行的,输出结果为1,表明使用了子shell
thenecho "子shell命令操作成功!"
elseecho "子shell命令操作失败。"
fi

BASH_SUBSHELL是一个环境变量,它表示当前 shell 的子 shell 级别。每当在 Bash 中启动一个新的子 shell 时,它的值就会增加。

#在顶层 shell 中,BASH_SUBSHELL 的值通常是 0
echo $BASH_SUBSHELL  # 输出: 0#启动一个子 shell, BASH_SUBSHELL 的值为1
(echo $BASH_SUBSHELL)  # 输出: 1#嵌套启动多个子 shell,BASH_SUBSHELL 的值
(echo $BASH_SUBSHELL; (echo $BASH_SUBSHELL))  # 输出: 1 和 2

 使用双括号

双括号命令允许在比较过程中使用高级数学表达式。

格式:(( expression ))

expression可以是任意的数学赋值或比较表达式,除了test命令使用的标准数学运算符外,还有如下所示的运算符

双括号命令符号
val++后增
val--后减
++val先增
--val先减
!逻辑取反
~位求反
**幂运算
<<左位移
>>右位移
&位布尔AND
|位布尔OR
&&逻辑AND
||逻辑OR

双括号命令既可以在if语句中使用,也可以在shell脚本中的普通命令中使用

#!/bin/bash
var1=9#双括号中的大于号不用转义
if (( $var1**2 > 80 ))
then(( var2 = $var1**2 ))echo "$var2大于$var1."
fi

 使用双方括号

格式:[[ expression ]]

双方括号提供了针对字符串比较的高级特性。expression既可以使用test命令中的标准字符串比较方法,还可以进行模式匹配。在进行模式匹配时,可以定义通配符或正则表达式来匹配字符串。

#!/bin/bash
if [[ $BASH_VERSION == 5.* ]]
thenecho "你使用的bash shell版本是5系列的。"
elseecho $BASH_VERSION
fi

声明:以上内容均是学习内容,非原创。

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

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

相关文章

23.DDD与微服务

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现&#xff0c;也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的…

Jenkins容器使用宿主机Docker(五)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装&#xff08;三&#xff09; Harbor镜像仓库介绍&安装 &#xff08;四&#xff09; Jenkins容器使用宿主机Docker&#xff08;五&#xff09; Jenkins流水线初体验&#xff08;六&#…

Python爬虫之Scrapy框架基础入门

Scrapy 是一个用于Python的开源网络爬虫框架&#xff0c;它为编写网络爬虫来抓取网站数据并提取结构化信息提供了一种高效的方法。Scrapy可以用于各种目的的数据抓取&#xff0c;如数据挖掘、监控和自动化测试等。 【1】安装 pip install scrapy安装成功如下所示&#xff1a;…

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…

git中的命令

目录 git的命令1.1 创建版本库1.2 添加文件和修改提交文件1.创建文件readme.txt, 此刻文件在工作区&#xff08;WorkSpace&#xff09;2.使用命令 git add readme.txt添加到暂存区里面去。3.提交文件到主分支4.修改文件&#xff0c;在文件中加入一行。查看git的状态 1.3 版本回…

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》

《Keras3 minist 手写数字AI模型训练22秒精度达到&#xff1a;0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束&#xff0c;训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…

docker 容器相互访问

目前采用 network 方式 1. 创建自定义网络 docker network create network-group 如下 2. 相互访问的容器更改&#xff08;目前演示redis 以及netcore api 访问redis &#xff09; //redis 原有容器删除 跟之前区别就是加入 --network network-group docker run \ -p 6379:…

YOLOv8目标检测(三*)_最佳超参数训练

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…

【rust杂乱笔记】

code . 打开vscode fn main() {println!("hello world!") }loop{}循环; break跳出循环 // 引入三方库 use rand::Rng; // 引入标准库中的输入输出 use std::cmp::Ordering; use std::io;// main函数 先执行main函数 fn main() {// 打印的宏方法// 打印提示信息print…

【C++初阶】第9课—标准模板库STL(string_3)

文章目录 1. string类对象的查找操作1.1 c_str返回c格式字符串1.2 substr获取string类对象子串1.3 find和rfind查找字符串内容1.4 find_first_of与find_first_not_of1.5 find_last_of与find_last_not_of1.6 copy复制string类对象内的字符串内容1.7 compare对比string类字符串1.…

Android Studio、JDK、AGP、Gradle、kotlin-gradle-plugin 兼容性问题

文章目录 问题&#xff1a;解决办法&#xff1a;gradle与 java的版本兼容AGP与Gradle的版本兼容kotlin 与 jvm 的版本兼容KGP、Gradle、AGP兼容关系kotlin 与 java 的编译版本配置 问题&#xff1a; 你从githb上clone了一个项目&#xff0c;本地跑的时候&#xff0c;各种报错。…

Linux中 vim 常用命令大全详细讲解

文章目录 前言一、Vim 基本操作 &#x1f579;️1.1 打开或创建1.2 退出编辑1.3 模式切换 二、Vim 光标移动命令 ↕️2.1 基本移动2.2 行内移动2.3. 单词移动2.4. 页面移动2.5. 行跳转 三、Vim 文本编辑命令 &#x1f4cb;3.1 插入和删除3.2 复制、剪切与粘贴3.3 替换与修改 四…

ubuntu+ros新手笔记(二):古月·ROS2入门21讲学习笔记

系统ubuntu22.04 ros2 humble 按照如下视频教程学习的&#xff1a;【古月居】古月ROS2入门21讲 | 带你认识一个全新的机器人操作系统 此处仅记录我报错的地方&#xff0c;以及相应的解决方案&#xff0c;没有出错的略过&#xff01; 对应的古月居ROS2入门21讲源码下载地址&a…

.NET 技术 | 调用系统API创建Windows服务

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录

win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09;实际操作记录 参考教程 : win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09; - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 &#xf…

Leetcode经典题11--加油站

题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 gas 和…