shell脚本之函数和数组

news2025/1/16 17:57:20

目录

一.函数

1.函数的简介

2.函数具有的几个要素

3.定义函数

4.调用函数

5.传递参数

6.函数返回值

7.函数的变量作用范围

8.函数递归

9.查看函数

二.数组

1.数组简介

2.定义数组

3.数组索引

4.数组替换


一.函数

1.函数的简介

在Shell脚本中,函数是一种用于组织和重用代码的机制,它们可以帮助您将脚本分解为更小的、可管理的部分。Shell脚本中的函数与其他编程语言中的函数类似,但在语法和用法上有一些特殊之处。

2.函数具有的几个要素

(1)函数名称: 用于标识函数的名称,其他部分通过这个名称来调用函数。

(2)参数列表: 函数可以接受零个或多个参数,这些参数可以是输入函数的数据或信息。

(3)函数体: 包含了函数执行的代码块,它定义了函数的行为和逻辑。

(4)返回值: 函数执行完毕后可能会返回一个值给调用它的代码,这个值可以用于后续的操作。

3.定义函数

在脚本中通过 function 关键字或者直接使用函数名来定义函数。函数定义可以在脚本的任何位置,但通常会在脚本的开头或者需要调用的地方定义。

# 使用 function 关键字定义函数
function my_function () {
    # 函数体,包含需要执行的命令
    echo "This is my function"
}
# 或者直接使用函数名定义函数
my_other_function() {
    # 函数体
    echo "This is my other function"
}
4.调用函数

在脚本中通过函数名和参数列表来调用函数。调用函数时,Shell会执行函数定义中的命令

5.传递参数

函数可以接受参数,这些参数可以在函数体内使用。在Shell脚本中,参数可以通过 $1, $2, $3, ... 来访问,依次代表第一个、第二个、第三个参数,以此类推。

示例

# 定义带参数的函数
greet() {
    echo "Hello, $1!"
}

# 调用函数并传递参数
greet "Alice"

6.函数返回值

函数可以通过 return 语句返回一个退出状态码。在Shell中,默认情况下,函数的返回值是函数中最后一个执行的命令的退出状态码。如果需要,可以使用 return 显式地指定返回值。

使用原则

(1)函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码

(2)退出状态码必须是0~255,超出时值将为除以256取余

示例:

(1)退出状态码在范围内时

# 定义带返回值的函数
get_sum() {
    local sum=$(( $1 + $2 ))
    return $sum
}
# 调用函数并获取返回值
get_sum 10 20
echo "Sum is: $?"

(2)退出状态码超出范围

解决方法:

在函数体内实验echo输出,在函数体外使用变量赋值

7.函数的变量作用范围

(1)函数在shell脚本中仅在当前的shell环境中有效

(2)shell脚本中函数的变量默认全局有效

(3)将变量限定在函数内部使用local命令

示例:

(1)变量全局有效

(2)使用local命令

8.函数递归

函数递归是指一个函数在其定义中调用自身的过程。这种方式通常用于解决可以被分解为相似子问题的问题,每次递归调用都会使问题规模减小,直到达到基本情况(终止条件)为止。

递归函数通常包括两个部分:

  1. 基本情况(终止条件):递归函数中的基本情况是停止递归的条件。当满足基本情况时,递归将不再继续,而是返回一个特定的值。这是递归的出口。

  2. 递归步骤:递归函数中的递归步骤是函数调用自身的部分。在每次递归调用中,问题的规模都会减小,直到达到基本情况为止。

在编写递归函数时,需要注意以下几点:

  • 确保存在基本情况,以避免函数陷入无限循环。
  • 确保每次递归调用都朝着基本情况逼近,以确保算法能够终止。
  • 考虑递归的性能,因为递归可能会导致函数调用的层级过深,从而消耗大量的内存空间和处理时间。

示例:

计算阶乘

fact() {
  if [ $1 -eq 1 ]
  then
    echo 1
  else
   local temp=$[$1 - 1]
   local result=$(fact $temp)
   echo $[$1 * $result]
		#  5 * $result(4*$result(3*$result(2*$result(1))))
  fi
}
read -p "请输入:" n
result=$(fact $n)
echo $result

9.查看函数

使用declare  -F命令

二.数组

1.数组简介

数组是一种数据结构,用于存储相同类型的元素的集合。它们通常具有固定的大小,这意味着一旦创建,它们的大小就不能改变。数组的元素可以通过索引访问,索引通常从 0 开始,依次递增。数组可以在内存中连续存储,因此可以通过索引快速访问元素,这使得数组在许多场景下都是高效的数据结构。

数组可以是单维的,也可以是多维的。单维数组是最简单的形式,它只包含一个维度,每个元素由一个索引唯一标识。多维数组是数组的数组,其中每个元素本身又是一个数组。例如,二维数组是一个表格或矩阵,可以通过两个索引来访问元素。

数组在编程中有广泛的应用,常见的编程语言都支持数组,包括但不限于 C、C++、Java、Python、JavaScript 和 Shell 脚本等。数组提供了一种方便的方式来组织和处理大量数据,例如存储学生成绩、处理图像像素、表示游戏地图等。

然而,数组的大小通常是固定的,这意味着在使用过程中需要注意数组越界的问题。另外,数组的插入和删除操作可能会比较耗时,因为需要移动其他元素以保持数组的连续性。

2.定义数组

在大多数编程语言中,数组可以通过直接声明来创建,或者通过构造函数或字面量初始化。

定义数组格式:

(1)数组名=(value0 value1 value2 value3 ......)

(2)数组名=([0]=value [1]=value1 [2]=value2 ....)

(3)列表名="value0 value1 value2 value3 ...... "

         数组名=($列表名)

(4)数组名[0]="value1"

         数组名[1]="value2"

         数组名[2]="value3"

3.数组索引

数组中的每个元素都有一个唯一的索引,用于访问该元素。索引通常从 0 开始,逐个递增。

示例:

4.数组替换

[1]为下标,下标默认为起始位为0

数组的定义使用示例脚本:

#!/bin/bash

# 定义一个名为 fruits 的数组
fruits=("apple" "banana" "orange" "grape")

# 打印数组中的所有元素
echo "所有水果: ${fruits[@]}"

# 打印数组的长度
echo "水果数量: ${#fruits[@]}"

# 访问数组中的单个元素(通过索引)
echo "第一个水果: ${fruits[0]}"
echo "第三个水果: ${fruits[2]}"

# 添加新元素到数组末尾
fruits+=("pear")
echo "添加梨后的所有水果: ${fruits[@]}"

# 删除数组中的元素
unset fruits[1]
echo "删除香蕉后的所有水果: ${fruits[@]}"

# 循环遍历数组中的所有元素
echo "遍历所有水果:"
for fruit in "${fruits[@]}"; do
    echo "$fruit"
done

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

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

相关文章

网络传输,请每次都开启 TCP_NODELAY

原文:Marc Brooker - 2024.05.09 (注:不必过于担心这个问题,大部分现代库,语言(如 Go),代理(如 Envoy),都默认设置了 TCP_NODELAY。如果遇到网络…

ubuntu编译pcl时报错

报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…

深度剖析进程概念与进程状态

文章目录 1. 前言2. 什么是进程2.1 进程概念2.2 进程描述——PCB 3. 进程的一些基本操作3.1 查看进程3.2 结束进程3.3 通过系统调用获取进程标示符3.4 通过系统调用创建子进程 4. 进程状态4.1 普适的操作系统层面4.2 具体Linux操作系统层面 5. 两种特殊的进程5.1 僵尸进程5.2 孤…

2024第二届区块链、物联网与金融管理国际会议(ICBITFM2024)

2024第二届区块链、物联网与金融管理国际会议(ICBITFM2024) 会议简介 2024第二届区块链、物联网与金融管理国际会议(ICBITFM 2024)是一个重要的学术会议,旨在促进区块链、物联网和金融管理领域的交流和合作,对于推动这些领域的发展和创新具有重要意义。…

云商店如何让更多企业摘到技术普惠的“果实”?

文 | 智能相对论 作者 | 沈浪 现阶段,越是工业体系发达的地区,越需要加速技术普惠的步伐。比如,在苏州,华为云就在联合当地政府、企业伙伴打造以华为云云商店为重要链接的智能化商业增长底座。 华为云云商店以“电商式”的购物…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

[IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

目录 Pinctrl子系统的概念 GPIO子系统的概念 定义自己的GPIO节点 GPIO子系统的函数 引脚号的确定 基于GPIO子系统的驱动程序 驱动程序 设备树修改 之前我们进行驱动开发的时候,对于硬件的操作是依赖于ioremap对寄存器的物理地址进行映射,以此来达…

VRRP协议-负载分担配置【分别在路由器与交换机上配置】

VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…

图片压缩工具,这三款软件简单好用!

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。无论是社交媒体上的分享,还是工作中的文件传输,图片都扮演着重要的角色。然而,随着图片质量的提高,其占用的存储空间也越来越大,这给我们的存储…

ChatGPT官网5月14日凌晨1点发布会推出最新GPT4o大模型,贾维斯时刻要来了?

就在今天北京时间2024年5月14日凌晨1点中,OpenAI进行了发布会,这次发布会的内容炸裂,一起来看下吧! GPT4o多模态大模型发布 首先公开的是GPT4o多模态大模型的发布,相较于GPT-4turbo速度更快,更便宜。我刚开…

OIDC 与 OAuth2.0学习

OpenID Connect (OIDC) 和 OAuth 2.0 是两种不同的协议,它们通常一起使用,但服务于不同的目的。下面是它们的 主要区别和联系: OAuth 2.0 OAuth 2.0 是一个授权框架,它允许第三方应用代表用户获取对服务器资源的有限访问权限。…

深度践行“IaaS on DPU”理念,中科驭数正式发布“驭云”高性能云异构算力解决方案

5月10日至14日,由国家发展改革委联合国务院国资委、市场监管总局、国家知识产权局共同主办的第八届中国品牌日活动在上海世博展览馆举行。中科驭数高级副总裁张宇在中国品牌日新品首发首秀环节正式发布驭云高性能云异构算力解决方案,为企业提供更快部署、…

AWS ECS On Fargate 监控可观测最佳实践

概述 Amazon ECS on Fargate 为用户提供了简单、高效且可靠的容器化解决方案,使用户能够专注于应用程序开发和运行,而无需担心基础设施管理的复杂性。与其同时,用户需要实时了解在该环境中应用程序运行的性能、可用性、健康状况和资源使用情…

虾皮选品:Shopee首季盈利2.4亿;TikTok美区电商权限要求降低

2024年5月14号,跨境电商日报: 1.Ozon已成功回款 2.TikTok降低美区达人开通电商权限要求 3.Shopee首季盈利2.4亿 4.6月1日起,亚马逊退货处理费收取标准更新 5.欧盟委员会对从中国台湾地区和越南进口的不锈钢冷轧产品征收反补贴和反倾销税…

[Cesium]Cesium基础学习——Primitive

Cesium开发高级篇 | 01空间数据可视化之Primitive - 知乎 Primitive由两部分组成:几何体(Geometry)和外观(Appearance)。几何体定义了几何类型、位置和颜色,例如三角形、多边形、折线、点、标签等&#xf…

最佳实践 | 用HelpLook构建一体化企业知识中台

企业知识中台是内容与数据的双向交流的重要载体,它不仅能够让企业的内容说话,也能够倾听和分析数据。 你是否因寻找建立企业内部知识库/知识中台和说明文档平台的合适工具而苦恼?HelpLook数字内容平台正是你的理想之选。该平台以其简洁且用户…

一个开箱即用的已集成全部主流前端工具、类库的vue3+nuxt3服务端渲染ssr项目

项目背景: 需实现公司国际官网项目的seo如果是react就选用next,因为我最近在用vue3,就试试使用nuxt在网上找了很多模版,发现都不理想,缺的东西比较多,没法做到开箱即用,所以自己造个模版项目采…

【Java基础】枚举类的方法及应用

如何实现让一个类有固定个数的对象 手动封装构造方法(private) → 创建静态对象 → final修饰静态对象,使其成为常量 class Season { //枚举类public final static Season SPRING new Season();public final static Season SUMMER new Se…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

如何用Rust获取本机CPU、内存在Web网页中显示?

目录 一、需求描述 二、具体操作步骤 三、知识点 1、systemstat 2、Actix 一、需求描述 需求: 1、需要使用Rust进行后端开发获取本机CPU和内存信息; 2、使用WEB框架发布API; 3、然后使用HTML/CSS/JavaScript进行前端开发&#xff0…