shell脚本(6)

news2024/11/25 10:06:49

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章

感谢泷羽sec 团队的教学
视频地址:shell(6)if条件判断与for循环结构_哔哩哔哩_bilibili

本文主要讲解shell脚本中的if条件判断和for循环结构。

一、if语句

Shell 脚本中的 if 语句用于根据条件执行不同的操作。基本语法如下:

if [ 条件 ]; then
    # 条件成立时执行的代码
elif [ 条件 ]; then
    # 条件不成立但满足 elif 的代码
else
    # 所有条件都不满足时执行的代码
fi
 整数比较:
#! /usr/bin/bash
  
a=15
b=20

if [ "$a" -eq "$b" ]; then
        echo "a = b"
elif [ "$a" -gt "$b" ]; then
        echo "a > b"
elif [ "$a" -lt "$b" ]; then
    echo "a < b"
else
        echo "没有符合上述的条件!"
fi
代码解析:
1. 变量定义
a=15 
b=20

  • a: 赋值为15。
  • b: 赋值为20。
2. 判断两个字符串是否相等
if [ "$a" -eq "$b" ]; then
    echo "a = b"
elif [ "$a" -gt "$b" ]; then
    echo "a > b"
elif [ "$a" -lt "$b" ]; then
    echo "a < b"
else
    echo "没有符合上述的条件!"

逻辑分析

  • [ "$a" -eq "$b" ]: 判断 a 和 b 的值是否相等。
  • [ "$a" -gt "$b" ]: 判断 a 的值是否大于 b 的值。
  • [ "$a" -lt "$b" ]:判断 a 的值是否小于 b 的值。
  • 由于 a=15 和 b=20,二者值不同,因此第一个分支条件不成立,于是程序会去到第二个分支判断a是否大于b,但a也不大于b,因此程序会去到第三个分支,去判断a是否小于b,很显然a小于b,因此程序输出的结果就是a < b。
  • 如果上述条件均不满足,程序会去到else分支,输出”没有符合上述的条件!“。

输出 

a < b

文件判断:
  • -e:文件存在
  • -f:存在且是普通文件
  • -d:存在且是目录
  • -r:文件可读
  • -w:文件可写
  • -x:文件可执行
#! /usr/bin/bash
  
file1=./7.0.0.tar.gz
file2=./ProxyCat-main
file3=./1.txt
if [ -e "$file1" ]; then
        echo "文件存在"
fi

if [ -f "$file3" ]; then
        echo "文件存在且是普通文件"
fi

if [ -d "$file2" ]; then
        echo "文件存在且是目录"
fi

if [ -r "$file1" ]; then
        echo "文件可读"
else
        echo "该文件没有读取权限!"
fi

if [ -w "$file1" ]; then
        echo "文件可写"
else
        echo "该文件没有写入权限!"
fi

if [ -x "$file1" ]; then
        echo "文件可执行"
else
        echo "该文件没有执行权限!"
fi
代码解析:
1. 变量定义
file1=./7.0.0.tar.gz 
file2=./ProxyCat-main 
file3=./1.txt

定义三个变量 file1file2file3,分别表示三个路径:

  • file1:文件路径 ./7.0.0.tar.gz
  • file2:目录路径 ./ProxyCat-main
  • file3:普通文件路径 ./1.txt
2. 检查文件是否存在
if [ -e "$file1" ]; then 
    echo "文件存在" 
fi
  • -e: 判断文件(或目录)是否存在。
  • 如果 file1 存在,无论是文件还是目录,输出 "文件存在"

因为文件 7.0.0.tar.gz 存在所以输出结果为:

文件存在
3. 检查是否是普通文件
if [ -f "$file3" ]; then 
    echo "文件存在且是普通文件" 
fi
  • -f: 判断路径是否为普通文件。
  • 如果 file3 是普通文件(非目录或特殊设备文件),输出 "文件存在且是普通文件"

因为文件 1.txt 存在且是普通文件所以输出结果为:

文件存在且是普通文件
4. 检查是否是目录
if [ -d "$file2" ]; then 
    echo "文件存在且是目录" 
fi
  • -d: 判断路径是否为目录。
  • 如果 file2 是目录,输出 "文件存在且是目录"

因为文件ProxyCat-main存在且是是目录所以输出结果为:

文件存在且是目录
5. 检查文件是否可读
if [ -r "$file1" ]; then 
    echo "文件可读" 
else 
    echo "该文件没有读取权限!" 
fi
  • -r: 判断文件是否有读取权限。
  • 如果 file1 可读,输出 "文件可读"。否则,输出 "该文件没有读取权限!"

因为 7.0.0.tar.gz 具备可读权限所以输出结果为:

文件可读
6. 检查文件是否可写
if [ -w "$file1" ]; then 
    echo "文件可写" 
else 
    echo "该文件没有写入权限!" 
fi
  • -w: 判断文件是否有写入权限。
  • 如果 file1 可写,输出 "文件可写"。否则,输出 "该文件没有写入权限!"

因为 7.0.0.tar.gz 不具备写入权限所以输出结果为:

该文件没有写入权限!
7. 检查文件是否可执行
if [ -x "$file1" ]; then 
    echo "文件可执行" 
else 
    echo "该文件没有执行权限!" 
fi
  • -x: 判断文件是否有执行权限。
  • 如果 file1 可执行,输出 "文件可执行"。否则,输出 "该文件没有执行权限!"

因为 7.0.0.tar.gz 不具备执行权限所以输出结果为:

该文件没有执行权限!

二、for循环结构

for 循环用于遍历列表或范围中的元素。语法如下:

for 变量 in 列表;
do
    # 循环体
done

在do和done之间的是每次循环需要执行的动作,也叫循环体

示例

示例
1.遍历列表
#! /usr/bin/bash
  
for day in Monday Tuesday Wednesday Thursday Friday;

do
        echo "当前是$day"

done
运行逻辑
for day in Monday Tuesday Wednesday Thursday Friday
  • 定义循环变量 day,其值依次为 MondayTuesdayWednesdayThursdayFriday
  • 每次循环,将当前的 day 值赋给循环体中的 day
echo "当前是$day"
  • 输出当前变量 day 的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前是Monday
当前是Tuesday
当前是Wednesday
当前是Thursday
当前是Friday
2.遍历数字范围
#! /usr/bin/bash
for i in {1..5};

do
        echo "当前数字是$i"

done
运行逻辑
for i in {1..5}
  • {1..5} 表示从数字 15 的一个范围,定义的循环变量 i,依此取值为1,2,3,4,5。
  • 定义的循环变量 i,每次循环的取值为1,2,3,4,5
echo "当前数字是$i"
  • 输出当前变量 i 的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前数字是1
当前数字是2
当前数字是3
当前数字是4
当前数字是5
3.遍历文件
#! /usr/bin/bash
for file in *;

do
    echo "当前文件是:$file"

done
运行逻辑
for file in *
  • * 通配符,匹配当前目录下的所有文件和子目录的名称
  • 定义的循环变量file每次循环会去取一个匹配的文件或目录名称。
echo "当前文件是:$file"
  • 输出当前变量 file的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前文件是1.txt
当前文件是7.0.0.tar.gz
当前文件是docker-compose-linux-x86_64.1
当前文件是g.sh
当前文件是install.sh
当前文件是k.sh
当前文件是ProxyCat-main
当前文件是ProxyCat.zip
当前文件是redis-7.0.0
当前文件是vulfocus
当前文件是y.sh
4.遍历通过 seq 生成范围
#! /usr/bin/bash
for num in $(seq 1 2 20);

do
        echo "当前数字是$num"

done 
运行逻辑
for num in $(seq 1 2 20)
  • seq 1 2 20:

    • seq 是一个用于生成序列的命令。
    • 语法:seq 起始值 步长 结束值。
    • 在此,seq 1 2 20 会生成一个从 1 开始,每次增加 2,直到不超过 20 的数字序列。
  • for num in $(...)

    • 使用 $(...) 命令替换语法,将 seq 命令的输出作为循环变量的取值。
    • 每次循环,num 依次取 seq 输出的值。
echo "当前数字是$num"
  • 输出当前变量 num的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前数字是1
当前数字是3
当前数字是5
当前数字是7
当前数字是9
当前数字是11
当前数字是13
当前数字是15
当前数字是17
当前数字是19
5.双(())for循环
for ((a=1;a<10;a++));

do
    echo $a

done
运行逻辑
for ((a=1;a<10;a++))
  • a=1,定义循环变量 a 的初始值为 1
  • a<10,每次循环开始时,检查条件 a<10 是否成立。如果条件为 true,进入循环体;否则退出循环。
  • a++,每次循环结束后,变量 a 的值增加 1
echo $a
  • 输出变量 a 的当前值。 
输出结果
1 
2 
3 
4 
5 
6 
7 
8 
9

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

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

相关文章

JavaScript基础 document.write()方法

JavaScript基础 document.write方法 1.简单认识document.write()2.document.write() 的使用 1.简单认识document.write() document.write() 是一种 JavaScript 方法&#xff0c;用于将内容直接写入到 HTML 文档中。它可以用来动态地在页面加载时插入文本、HTML 代码、图片等内…

Linux笔记---进程:进程切换与O(1)调度算法

1. 补充概念 1.1 并行与并发 竞争性&#xff1a;系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至只有1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#xff0c;更合理竞争相关资源&#xff0c;便具有了优先级。独立性&#xff1a;多进程运…

使用ENSP实现浮动静态路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为2.…

GoF设计模式——结构型设计模式分析与应用

文章目录 UML图的结构主要表现为&#xff1a;继承&#xff08;抽象&#xff09;、关联 、组合或聚合 的三种关系。1. 继承&#xff08;抽象&#xff0c;泛化关系&#xff09;2. 关联3. 组合/聚合各种可能的配合&#xff1a;1. 关联后抽象2. 关联的集合3. 组合接口4. 递归聚合接…

【论文复现】深度知识追踪

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 深度知识追踪 1. 论文概述2. 论文方法3. 实验部分3.1 数据集3.2 实验步骤3.3 实验结果 4 关键代码 1. 论文概述 知识追踪的任务是对学生的知…

Linux: 进程地址空间(理解虚拟地址和页表)

目录 1. 虚拟地址 2. 进程地址空间分布 3. 描述进程地址空间 4. 内存管理——页表 5. 父子进程的虚拟地址关系 6. 页表标记位 6.1 读写权限 6.2 命中权限 7.为什么存在进程地址空间 1. 虚拟地址 #include <stdio.h> #include <unistd.h> #include <sy…

C语言:深入理解指针

一.内存和地址 我们知道计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们买电脑的时候&#xff0c;电脑上内存是 8GB/16GB/32GB 等&#xff0c;那这些内存空间…

transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景

随着大模型的广泛应用&#xff0c;越来越多的开发者希望在前端直接运行机器学习模型&#xff0c;从而减少对后端的依赖&#xff0c;并提升用户体验。Transformer.js 是一个专为前端环境设计的框架&#xff0c;它支持运行基于 Transformer 架构的深度学习模型&#xff0c;尤其是…

uni-app 发布媒介功能(自由选择媒介类型的内容) 设计

1.首先明确需求 我想做一个可以选择媒介的内容&#xff0c;来进行发布媒介的功能 &#xff08;媒介包含&#xff1a;图片、文本、视频&#xff09; 2.原型设计 发布-编辑界面 通过点击下方的加号&#xff0c;可以自由选择添加的媒介类型 但是因为预览中无法看到视频的效果&…

行业分析---2024年小鹏汽车AI Day及三季度财报

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…

数据可视化复习1-Matplotlib简介属性和创建子图

1.Matplotlib简介 Matplotlib是一个Python的2D绘图库&#xff0c;它可以在各种平台上以各种硬拷贝格式和交互环境生成具有出版品质的图形。通过Matplotlib&#xff0c;开发者可以仅需要几行代码&#xff0c;便可以生成绘图、直方图、功率谱、条形图、错误图、散点图等。 以下…

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是&#xff1a; 在官网说明里&#xff0c;才版本2024.1开始&#xff0c;默认启用的 Vue Language Server&#xff0c;但是在 Vue 2 项目…

如何安全删除 Linux 用户帐户和主目录 ?

Linux 以其健壮性和灵活性而闻名&#xff0c;是全球服务器和桌面的首选。管理用户帐户是系统管理的一个基本方面&#xff0c;包括创建、修改和删除用户帐户及其相关数据。本指南全面概述了如何在 Linux 中安全地删除用户帐户及其主目录&#xff0c;以确保系统的安全性和完整性。…

如何利用ros搭建虚拟场景通过仿真机器人完成一次简单的SLAM建图、导航规划(超简单)?——学习来源:机器人工匠阿杰

一&#xff1a;什么是SLAM&#xff0c;SLAM和导航规划又有什么关系&#xff1f; SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;即同时定位与建图&#xff09;是一种在未知或动态环境中自行驶的重要技术。主要通过设备上的传感器&#xff08;如激光雷达、…

shell脚本(完结)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shell编程&#xff08;完结&#xff09;_哔哩哔哩_bilibili 本文主要讲解不同shell脚本中的相互调用以及输入输出重定向操作。 一、不同脚本之间…

禁用达梦DEM的agent

agent占用内存较多&#xff0c;实际没什么使用&#xff0c;考虑停止agent 应该切换到root执行停止 cd /dm/dmdbms/tool/dmagent/service/ ./DmAgentService stop禁用

使用ChatGPT生成和优化电子商务用户需求规格说明书

在电子商务项目开发中&#xff0c;用户需求规格说明书&#xff08;User Requirement Specification, URS&#xff09;是团队沟通与项目成功的基石。然而&#xff0c;面对复杂多变的需求&#xff0c;如何快速生成清晰、完整且具备说服力的文档&#xff1f;这正是AI工具的用武之地…

产品研发管理和研发项目管理的区别是什么

产品研发管理与研发项目管理有显著的区别&#xff0c;主要体现在管理范围、目标导向和执行方法上。产品研发管理侧重于产品生命周期的规划与执行&#xff0c;强调产品的创新性和市场需求对接&#xff0c;而研发项目管理则更注重具体项目的执行过程&#xff0c;聚焦项目时间、成…

摆烂仙君传——深度学习秘境奇缘

第一章&#xff1a;深度学习秘境 在修仙界与科技交织的边缘&#xff0c;八荒六合九天无上摆烂仙君在其高科技修炼室中感应到一股神秘的召唤。这股力量似乎与他的灵魂产生了共鸣&#xff0c;引导他前往传说中的深度学习秘境。在那里&#xff0c;古老的仙法与前沿的算法交织&…

【FPGA开发】Vivado自定义封装IP核,绑定总线

支持单个文件的封装、整个工程的封装&#xff0c;这里用单个文件举例。 在文件工程目录下&#xff0c;自建一个文件夹&#xff0c;里面放上需要封装的verilog文件。 选择第三个&#xff0c;指定路径封装&#xff0c;找到文件所在目录 取个名&#xff0c;选择封装IP的路径 会…