Shell编程-8

news2024/11/23 8:02:14

声明:学习视频来自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 ]
do
    echo $i
    i=$((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 ]
    do
        echo $i
        i=$((i+1))
    done
  • until 循环 示例:等待用户输入一个非空字符串。

    input=""
    until [ -n "$input" ]
    do
        read -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):" num

case $num in
   1)
       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 "$@"; do
        echo "$message"
    done
}

# 调用函数,传入一些消息
print_message "Hello, World!" "This is a test." "Functions are useful."

# 定义一个函数,用于计算两个数的和
add_numbers() {
    local num1=$1
    local num2=$2
    local sum=$(expr $num1 + $num2)
    echo $sum
}

# 调用函数,计算两个数的和
result=$(add_numbers 3 5)
echo "The sum is: $result"

在这个示例中:

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

注意事项

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

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

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

相关文章

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点

如图,如果要实现上方的效果: 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…

ubuntu下如何使用C语言访问Mysql数据库(详细介绍并附有案例)

一、配置 首先,确保你已经安装了MySQL服务器和MySQL Connector/C库。在Linux上,你可以使用包管理器来安装这些,例如: sudo apt-get install mysql-server libmysqlclient-dev 在ubuntu的机器上,库文件通常保存在 /li…

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网:控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…

直播服务器多设备同显方案

在直播行业中,服务器多设备同显方案已成为一种创新且高效的技术应用。这一技术不仅能够满足大规模同步直播的需求,还能显著提升观众的观看体验和参与度。本文将深入探讨直播服务器多设备同显方案的技术细节、实施步骤以及在不同场景下的应用价值。 直播服…

101.【C语言】数据结构之二叉树的堆实现 下

目录 1.堆删除函数HeapPop 一个常见的错误想法:挪动删除 正确方法 设计堆顶删除函数HeapPop 解析向下调整函数AdjustDown 向下调整最多次数 向下调整的前提 代码实现 2.测试堆删除函数 运行结果 3.引申问题 运行结果 4.练习 分析 代码 执行过程图 运行结果 承…

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…

【CSP CCF记录】201903-1第16次认证 小中大

题目 样例1输入 3 -1 2 4 样例1输出 4 2 -1 样例1解释 4 为最大值,2 为中位数,−1 为最小值。 样例2输入 4 -2 -1 3 4 样例2输出 4 1 -2 样例2解释 4 为最大值,(−13)21为中位数,−2为最小值。 思路 本题两个注意点&#xff0…

P8692 [蓝桥杯 2019 国 C] 数正方形:结论,组合数学

题目描述 在一个 NNNN 的点阵上,取其中 44 个点恰好组成一个正方形的 44 个顶点,一共有多少种不同的取法? 由于结果可能非常大,你只需要输出模 10971097 的余数。 如上图所示的正方形都是合法的。 输入格式 输入包含一个整数 …

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?

大家好,我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?】面试题。希望对大家有帮助; Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的? 100…

【题解】—— LeetCode一周小结46

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结45 11.切棍子的最小成本 题目链接:1547. 切棍子的最…

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下,社交媒体成为品牌营销的主战场。然而,面对海量的用户数据和日益复杂的运营需求,传统营销方法显得力不从心。AI社媒引流王应运而生,帮助企业在多平台中精准触达目标用户,提升营销效率和效果。 1.…

Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例

一、首先要下载谷歌驱动 1.(打开谷歌浏览器 - 设置 - 关于谷歌,查看谷歌浏览器版本,否则不对应无法调用,会提示:selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This versio…

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么

今天学Flink的关键技术–容错机制&#xff0c;用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点&#xff08;checkpoint&#xff09; Flink容错机制的核心是分布式数据流和状态的快照&#xff0c;从而当分布…

再次讨论下孤注一掷

在孤注一掷中的黑客技术里面&#xff0c;简单介绍了电影孤注一掷中用的一些"黑科技"&#xff0c;这里继续讨论下&#xff0c;抛弃这些黑科技&#xff0c;即使在绝对公平的情况下&#xff0c;你也一样赢不了赌场 相对论有一个假设就是光速不变&#xff0c;这里也有个…

微信小程序技术架构图

一、视图层1.WXML&#xff08;WeiXin Markup Language&#xff09; 这是微信小程序的标记语言&#xff0c;类似于 HTML。它用于构建小程序的页面结构。例如&#xff0c;通过标签来定义各种视图元素&#xff0c;如<view>&#xff08;类似于 HTML 中的<div>&#xff…

GaussDB 华为高斯数据库

GaussDB 是华为推出的一款企业级分布式数据库&#xff0c;旨在为企业提供高效、可靠、安全的数据库服务。GaussDB 基于华为在数据库领域的多年积累&#xff0c;结合人工智能技术和分布式架构&#xff0c;支持多种场景的数据存储与管理需求&#xff0c;是云计算、大数据、人工智…

redis工程实战介绍(含面试题)

文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * &#xff0c;fl…

C++从零到满绩——入门基础and类和对象(上)

目录 1>>前言 2>>函数重载 3>>引用 3.1>>引用的概念 3.2>>引用三大特性 3.3>>引用的使用 3.4>>const引用 3.5>>指针与引用的关系 4>>inline内联函数 5>>nullptr 6>>类和对象&#xff08;上&#…