Shell编程-8

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

感谢泷羽sec 团队的教学
视频地址:shell编程(8) until循环以及函数基本创建调用_哔哩哔哩_bilibili

一、until循环结构

在Shell编程中,until 循环是一种常见的循环结构,它与 while 循环相对。until 循环会重复执行一段代码,直到某个条件为真(即条件表达式的结果为非零)时才停止。这种循环特别适用于在某个条件达成之前需要不断尝试的情况。

1.基本语法

until 循环的基本语法如下:

until [ 条件表达式 ]
do# 循环体中的命令
done
  • until 后面跟着一个条件表达式,这个表达式通常是用方括号 [ 条件表达式 ] 包围的。
  • dodone 之间的部分是循环体,包含了在每次循环迭代中需要执行的命令。
  • 循环会一直执行,直到条件表达式的结果为真(即返回值为0)。

示例

假设我们想要打印出从0到9的数字,可以使用 until 循环来实现:

i=0
until [ $i -gt 9 ]
doecho $ii=$((i+1))
done

在这个例子中:

  • 初始化变量 i 为0。
  • until [ $i -gt 9 ] 表示循环将继续执行,直到 i 大于9。
  • 在循环体中,首先打印出 i 的值,然后 i=$((i+1))i 的值增加1。
  • i 增加到10时,条件 $i -gt 9 为真,循环停止。

2.until循环结构和while循环结构的区别

在Shell脚本中,until 循环和 while 循环都是用于重复执行一段代码的控制结构,但它们在执行逻辑上是相反的。下面是它们的主要区别:

(1)执行条件
  • while 循环:在条件为真(即条件表达式的结果为非零)时继续执行循环体。只有当条件为真时,循环体内的命令才会被执行。
  • until 循环:在条件为假(即条件表达式的结果为零)时继续执行循环体。只有当条件为假时,循环体内的命令才会被执行。
(2) 循环结束条件
  • while 循环:当条件变为假(即条件表达式的结果为零)时,循环结束。
  • until 循环:当条件变为真(即条件表达式的结果为非零)时,循环结束。
(3) 典型用途
  • while 循环:通常用于在某个条件持续为真的期间内重复执行任务,例如处理文件中的每一行,直到文件结束。
  • until 循环:通常用于在某个条件变为真之前重复执行任务,例如等待某个文件被创建或某个进程结束。
示例
  • while 循环 示例:打印数字从1到5。

    i=1
    while [ $i -le 5 ]
    doecho $ii=$((i+1))
    done
  • until 循环 示例:等待用户输入一个非空字符串。

    input=""
    until [ -n "$input" ]
    doread -p "请输入一个非空字符串:" input
    done
    echo "您输入的是:$input"

在实际应用中,选择 while 还是 until 循环取决于你的具体需求和循环的逻辑条件。

二、case语句结构

在Shell编程中,case 语句是一种多分支选择结构,允许你根据变量的值来执行不同的代码块。这种结构在需要对单个变量的多个可能值进行测试并执行相应操作时非常有用。

基本语法

case 语句的基本语法如下:

case 变量名 in模式1)# 当变量匹配模式1时执行的命令;;模式2)# 当变量匹配模式2时执行的命令;;*)# 当变量不匹配任何已列出的模式时执行的命令(可选);;
esac
  • case 后面跟着一个变量名,这个变量的值将被用来与后面的模式进行匹配。
  • 每个模式后面跟着一个右括号 ),然后是一系列命令,这些命令在变量值与模式匹配时执行。
  • ;; 用于结束每个模式分支的命令列表。
  • *) 是一个通配符模式,用于匹配所有未被前面模式捕获的值。这可以看作是case语句的默认分支。
  • esac 结束整个case语句。
示例

假设你想要根据不同的用户输入执行不同的操作,可以使用case语句来实现:

read -p "请输入一个数字(1, 2, 3):" numcase $num in1)echo "您选择了数字 1";;2)echo "您选择了数字 2";;3)echo "您选择了数字 3";;*)echo "无效的输入,请输入 1, 2 或 3。";;
esac

在这个例子中:

  • 用户被提示输入一个数字。
  • case 语句根据用户输入的数字num来决定执行哪个分支。
  • 如果用户输入1、2或3,相应的分支将被执行,输出相应的消息。
  • 如果用户输入的不是1、2或3,*) 分支将被执行,输出错误消息。

注意事项

  • case语句中,模式可以是具体的值,也可以是使用通配符的模式。
  • 模式匹配是大小写敏感的,可以在比较之前将变量值和模式都转换为同一种大小写(通常是全部转换为小写或大写),通过使用 tr 命令、lowercaseuppercase 函数来实现。
  • ;; 是每个分支的结束标记,不能省略。
  • *) 分支是可选的,但通常用于处理未预料到的输入。

三、函数

在Shell脚本中,函数是一种非常有用的功能,它允许你定义可重复使用的代码块。通过使用函数,你可以提高脚本的模块化程度,使得代码更加清晰和易于维护。

函数定义

在Shell中定义函数的基本语法如下:

函数名() {# 函数体中的命令
}

函数调用

定义函数后,你可以通过简单地调用函数名来执行函数体内的代码:

函数名

参数传递

函数可以接收参数,这些参数在函数体内可以通过特殊参数 $1, $2, $3, ... 来访问,其中 $1 是第一个参数,$2 是第二个参数,依此类推。所有传递给函数的参数可以通过 $@ 来访问。

返回值

Shell函数可以通过 return 语句返回一个值,但这个值主要用于 if, while, until 等结构中的条件判断。函数的返回值实际上是函数最后一条命令的退出状态,可以通过 $? 来获取。

示例

下面是一个简单的Shell脚本示例,展示了如何定义和使用函数:

#!/bin/bash# 定义一个函数,用于打印传入的参数
print_message() {for message in "$@"; doecho "$message"done
}# 调用函数,传入一些消息
print_message "Hello, World!" "This is a test." "Functions are useful."# 定义一个函数,用于计算两个数的和
add_numbers() {local num1=$1local num2=$2local sum=$(expr $num1 + $num2)echo $sum
}# 调用函数,计算两个数的和
result=$(add_numbers 3 5)
echo "The sum is: $result"

在这个示例中:

  • print_message 函数接受任意数量的参数,并打印每个参数。
  • add_numbers 函数接受两个参数,计算它们的和,并打印结果。

注意事项

  • 函数内部定义的变量默认是局部变量,不会影响脚本其他部分。
  • 使用 local 关键字可以明确声明局部变量。
  • 函数可以提高脚本的可读性和可维护性,但过度使用或不当使用也可能导致脚本难以理解和调试。

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

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

相关文章

【Linux】重定向,dup

目录 文件描述符分配规则 重定向 dup ​编辑 输出重定向 追加重定向 输入重定向。 重定向会影响后面的程序替换吗? 1号文件和2号文件 2号文件输出重定向 下标之间的重定向 文件描述符分配规则 重定向 把显示器文件关闭后,本来应该写给显示器…

Vue实训---1-创建Vue3项目

1.创建项目(项目名为my-vue-project) npm create vitelatest my-vue-project -- --template vue 运行命令npm -v,查看npm版本号,如果是npm 7或更高版本运行以上命令即可。如果是npm 6或更低版本,使用npm create vite…

智慧社区方案提升居民生活质量与管理效率的创新实践

内容概要 智慧社区方案的背景与发展趋势指向了一个日益重要的方向,随着城市化进程的加快,传统的社区管理模式逐渐显得力不从心。在这个时候,智慧社区应运而生,它通过将现代信息技术与社区管理深度结合,为提升居民生活…

【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5

文章目录 CodeMoss 简介CodeMoss 的模型集成如何安装和配置 CodeMossIDER 插件安装步骤 CodeMoss 的实战使用AI 问答功能代码优化与解释优化这段代码解释这段代码 文件上传与对话联网查询与 GPT 助手联网查询GPT 助手 提升开发效率的最佳实践结语更多文献 CodeMoss 简介 CodeM…

Java安全—JNDI注入RMI服务LDAP服务JDK绕过

前言 上次讲到JNDI注入这个玩意,但是没有细讲,现在就给它详细地讲个明白。 JNDI注入 那什么是JNDI注入呢,JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口&…

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式:页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

YOLOv11来了,使用YOLOv11训练自己的数据集和预测 (保姆级无代码操作版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言性能表现数据集准备1.数据标注2.数据标签转换 YOLO模型训练教程1.模型安装2.YOLO11 模型训练3.YOLO11 预测结果 总结 前言 YOLOv11是由Ultralytics团队于2024年…

彻底理解消息队列的作用及如何选择

一.为什么要使用消息队列? 使用消息队列,其实是需要根据实际业务场景来的,一般都是实际开发中,遇到了某种技术挑战,如果不使用MQ的话,业务实现起来比较麻烦,但是通过MQ就可以更快捷高效的实现业…

在 Taro 中实现系统主题适配:亮/暗模式

目录 背景实现方案方案一:CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme?代码示例 方案二:通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序,需求是页面的UI主题想要跟随手机系统的主题适配…

飞凌嵌入式T113-i开发板RISC-V核的实时应用方案

随着市场对嵌入式设备的功能需求越来越高,集成了嵌入式处理器和实时处理器的主控方案日益增多,以便更好地平衡性能与效率——实时核负责高实时性任务,A核处理复杂任务,两核间需实时交换数据。然而在数据传输方面,传统串…

SpringCloud实用-OpenFeign 调用三方接口

文章目录 前言正文一、项目环境二、项目结构2.1 包的含义2.2 代理的场景 三、完整代码示例3.1 定义FeignClient3.2 定义拦截器3.3 配置类3.4 okhttp配置3.5 响应体3.5.1 天行基础响应3.5.2 热点新闻响应 3.6 代理类3.6.1 代理工厂3.6.2 代理客户端3.6.3 FeignClient的建造器 四…

《Object类》

目录 一、Object类 1.1 定义与地位 1.2 toString()方法 1.3 equals()方法 1.4 hashcode()方法 一、Object类 1.1 定义与地位 Object类是Java语言中的根类,所有的类(除了Object类)都直接或间接继承自Object。这就意味着在Java中&#xf…

单头蜗杆铣刀计算——记录一下

前面介绍过一期蜗杆的一些常用的加工方式《蜗杆的加工方式》,其中铣削加工也是非常常见的一种加工方式,下面来看看蜗杆铣刀的由来过程: 首先拿到蜗杆参数之后,需要将蜗杆准确的描述出来。渐开线蜗杆的参数与齿轮基本一致&#xf…

【Flask+Gunicorn+Nginx】部署目标检测模型API完整解决方案

【Ubuntu 22.04FlaskGunicornNginx】部署目标检测模型API完整解决方案 文章目录 1. 搭建深度学习环境1.1 下载Anaconda1.2 打包环境1.3 创建虚拟环境1.4 报错 2. 安装flask3. 安装gunicorn4. 安装Nginx4.1 安装前置依赖4.2 安装nginx4.3 常用命令 5. NginxGunicornFlask5.1 ng…

大数据实战——MapReduce案例实践

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 大数据实战——MapReduce案例实践 一.过程分析(截图)1. 确定Hadoop处于启动状态2. 在/usr/local/filecotent…

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x,x 的所有正因数(除了 x 本身)被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数,则称该数字为 特殊数字。例如: 数字 4 是 特殊数字,因为它的真因数为 1 和…

java基础概念37:正则表达式2-爬虫

一、定义 【回顾】正则表达式的作用 作用一:校验字符串是否满足规则作用二:在一段文本中查找满足要求的内容——爬虫 二、本地爬虫VS网络爬虫 2-1、本地爬虫 示例: 代码优化: public static void main(String[] args) {// 大…

Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复

目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件:apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…

SQL注入靶场演练

找闭合,用万能密码,发现过滤or,所以绕过admin’oORr‘1‘’1 发现登陆成功 尝试用order by查询列数,又发现by过滤,所以绕过admin’/**/oorrder/**/bBYy/**/3查出列数是3 用联合查询,发现过滤http://139.1…

【软件入门】Git快速入门

Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…