Shell脚本函数简介及运用

news2024/10/7 19:17:18

目录

一、函数的作用

二、定义函数

三、调用函数

1.在脚本中调用函数

2.在函数中调用函数

四、函数传参

五、函数的返回值

六、函数的递归

七、函数及其变量的作用范围

八、外部脚本调用函数


一、函数的作用

  1. 语句块定义成函数约等于别名,定义函数,再引用函数

  2. 封装的可重复利用的具有特定功能的代码

二、定义函数

定义函数就是只将一段实现某个任务的命令序列封装进一个函数,便于使用和后期维护。

function 函数名() { 命令序列 }

函数名() { 命令序列 }

​
[root@localhost1 func]#vim definite.sh
#!/bin/bash
#定义函数运算()
function yunsuan() {
  a=2
  b=3
  jia=$[ $a + $b ]
  jian=$[ $a - $b]
  echo "相加等于:$jia"
  echo "相减等于:$jian"
}


​

三、调用函数

定义过的函数需要调用才能执行其中的命令序列。

1.在脚本中调用函数

[root@localhost1 func]#vim definite.sh
#!/bin/bash
function yunsuan() {
  a=2
  b=3
  jia=$[ $a + $b ]
  jian=$[ $a - $b]
  echo "相加等于:$jia"
  echo "相减等于:$jian"
}
​
#直接在脚本中写入函数名
yunsuan
​
[root@localhost1 func]#bash definite.sh
相加等于:5
相减等于:-1

2.在函数中调用函数

[root@localhost1 func]#vim definite.sh
#!/bin/bash
function jiajian() {
  a=10
  b=3
  jia=$[ $a + $b ]
  jian=$[ $a - $b]
  echo "相加等于:$jia"
  echo "相减等于:$jian"
}
​
function chengchu() {
  a=10
  b=3
  cheng=$[ $a * $b ]
  chu=$[ $a / $b]
  echo "相乘等于:$cheng"
  echo "相除等于:$chu"
}
​
#调用上两个函数
yunsuan() {
  jiajian
  chengchu
}
​
yunsuan
​
[root@localhost1 func]#bash definite.sh
相加等于:13
相减等于:7
相乘等于:30
相除等于:3

四、函数传参

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。例如:$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。

注意

  • 当我们执行脚本时跟的参数,对应的是脚本中的位置变量

  • 当我们执行函数时跟的参数,对应的是函数中的位置变量

虽然都表示为$1、$2,但我们执行一个函数时,传入的参数只跟其输入函数的顺序有关,与输入脚本时传入参数的顺序无关。

[root@localhost1 ~]#vim chuancan.sh
#!/bin/bash
​
test1() {
  jian=$[ $1 - $2 ]   #脚本中的$1对应先传入的30,$2对应后传入的50
  echo "相减的值为:$jian"
}
​
test1 $2 $1   #执行函数时,先传入30($2),再传入50($1)
​
[root@localhost1 ~]#bash chuancan.sh 50 30  #执行脚本时传入参数 $1对应50 $2对应30
相减的值为:-20

五、函数的返回值

return 表示退出函数并返回一个退出值,脚本中可以用$?变量表示该退出值(状态码)

在函数中的使用原则

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

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

状态码含义
0执行成功
非0不同程度的错误
2用法不当
126不是可执行的
127命令未找到
[root@localhost1 array]#vim returntest.sh
#!/bin/bash
returntest1() {
  if [ $1 -eq $passwd ];then
    echo "$name的密码输入正确!"
  else
    echo "$name的密码输入错误!"
    return 1
  fi
}
​
name=张三
passwd=123456
returntest1 $1
​
​
[root@localhost1 array]#bash returntest.sh 123
张三的密码输入错误!
[root@localhost1 array]#echo $?  
1     -- 这里输入错误返回了我们指定的状态码1
[root@localhost1 array]#bash returntest.sh 123456
张三的密码输入正确!
[root@localhost1 array]#echo $?
0

六、函数的递归

是指函数在满足递归条件的情况下,调用函数本身执行到

[root@localhost1 ~]#vim jiecheng.sh
#!/bin/bash
fact() {
  if [ $1 -eq 0 -o $1 -eq 1 ];then
    echo 1
  else
    way=$[$1 - 1]    #迭代方式(指定数每次减1)
    result=$(fact $way)    #递归执行函数(使初始值每次减1)
    echo $[ $1 * $result ]    #输出初始值乘每次递归的值,直到1(实现阶乘效果)
  fi
}
read -p "请输入一个数:" n
result=$(fact $n)
echo "$n的阶乘为:$result"
​
​
[root@localhost1 ~]#bash jiecheng.sh
请输入一个数:6
6的阶乘为:720
[root@localhost1 ~]#bash jiecheng.sh
请输入一个数:1
1的阶乘为:1
[root@localhost1 ~]#bash jiecheng.sh 
请输入一个数:4
4的阶乘为:24
[root@localhost1 ~]#bash jiecheng.sh 
请输入一个数:9
9的阶乘为:362880

七、函数及其变量的作用范围

  1. 函数在shell脚本中仅在当前shell环境中有效

  2. shell脚本中变量默认全局有效

  3. 将变量限定在函数内部(定义变量前加上 local 命令)

​
[root@localhost1 ~]#vim variable.sh
#!/bin/bash
#定义i变量值为1
i=1  
​
test1() {
 i=10    #定义i变量值为10
 echo $i
}
​
test1    #调用函数
echo $i    #输出变量i的值
​
#输出的i均为10,是由于第二点的特性,i的值在函数中被重新赋值了
[root@localhost1 ~]#bash variable.sh
10
10


​

使用 local 限定函数内部变量

[root@localhost1 ~]#vim variable.sh
#!/bin/bash
i=1
​
test1() {
 local i=10    #加local限定为内部变量,将不再影响函数外的变量
 echo $i
}
​
test1
echo $i
​
​
[root@localhost1 ~]#bash variable.sh
10
1

八、外部脚本调用函数

在外部脚本调用一个脚本或文件中的函数,需要先在脚本中加载目标文件,需要使用绝对路径(source 文件名 或 . 文件名),再输入函数名即可执行。

[root@localhost1 ~]#vim hanshu.sh
#!/bin/bash
​
test1() {
  echo "我是hanshu.sh文件中的test1函数"
}
​
#在外部脚本中调用hanshu.sh中的test1函数
[root@localhost1 ~]#vim diaoyong.sh
source /root/hanshu.sh
​
test1
​
#执行外部脚本
[root@localhost1 ~]#bash diaoyong.sh
我是hanshu.sh文件中的test1函数

调用函数库文件

函数库文件是指将一些常用的函数提前编写好放入这个函数库文件,当我们编写脚本时,同样通过绝对路径加载函数库文件,在调用其中的函数,这样可以提高代码编写的效率(类似于java中面向对象编程,调用方法)

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

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

相关文章

【云原生网关】Apache ShenYu 使用详解

目录 一、前言 二、Apache ShenYu 介绍 2.1 为什么叫ShenYu 2.2 ShenYu特点 2.3 ShenYu架构图 2.4 shenyu数据同步原理 2.4.1 Zookeeper数据同步原理 三、Apache ShenYu 安装部署 3.1 部署流程 3.1.1 创建 Docker Network 3.1.2 拉取Apache ShenYu Admin镜像 3.1.3…

C语言之函数栈帧的创建与销毁(2)

上一篇博客我们讲到了函数栈帧的创建与销毁(1)今天我们来讲解Add函数的函数栈帧相关知识 在开始本章博客之前,大家可以把上一篇博客的主要内容仔细复习一下 看图 第一个mov:把b的值放到eax里面去 第二个mov:把a的…

【python】【excel】用excel中指定单元格的内容去替换一个文本中指定的字符

1 使用背景 理正的.spw文件是文本格式,类似于该软件的前处理,相关参数字段可通过文本替换,快速修改参数。 后续用途可用在:用EXCEL整理数据,通过修改文本批量获取多个截面参数的spw文件 2 ExcelSheet-shift-textstr…

macOS中解决matplotlib中文乱码

现象 图表上中文变方框,日志中报错如下: findfont: Generic family sans-serif not found because none of the following families were found: 解决办法 下载字体 http://xiazaiziti.com/210356.html 查询字体保存路径 查看配置文件路径 import…

01- 数据类型(C语言)

一 变量和常量 1.1 标识符 1、在我们所写的“第一个C程序”中出现了很多的标识符,例如include、main、printf、return。标识符是⽤来标识变量、函数,或任何其他⽤户⾃定义项⽬的名称。 2、标识符的约束规范: 只能包含数字、字母和下划线不…

chatgpt赋能python:Python怎么删除列表

Python怎么删除列表 什么是Python列表? 在Python中,列表是一个可变的序列,它可以包含不同类型的数据。列表可以使用中括号 [] 来定义,每个元素之间用逗号分隔。列表中的元素可以通过其下标进行访问,下标从0开始。 P…

Skywalking基础使用

Skywalking基础使用 agent的使用Linux下Tomcat7和8中使用Spring Boot中使用RocketBot的使用 agent的使用 agent探针可以让我们不修改代码的情况下,对java应用上使用到的组件进行动态监控,获取运行数据发送到OAP上进行统计和存储。agent探针在java中是使…

C语言之数组初级(5-8)

目录 1. 一维数组的创建和初始化 2. 一维数组的使用 3. 一维数组在内存中的存储 4. 二维数组的创建和初始化 5. 二维数组的使用 6. 二维数组在内存中的存储 7. 数组越界 8. 数组作为函数参数 二维数组的画图讲解 例如现在我要找第二行第三列这个元素,下面是…

放大电路与频率特征(期末模电速成)

目录 1、放大电路基础 2、放大电路三种组态 3、放大电路分析(必考) 4、多级放大电路 5、差动放大电路 6、频率特征 1、放大电路基础 晶体管输出特性曲线中的线性区域是指 放大区 ,iC βiB NPN 型静态工作点过高,容易产生 饱…

Vue 中的表格操作

Vue 中的表格操作 在 Web 开发中,表格是非常常见的元素之一。在 Vue 中,我们可以使用一些组件和插件来实现表格的操作。在本文中,我们将介绍 Vue 中的表格操作的基本原理和用法,并给出一些实例代码来帮助读者更好地理解。 表格…

Scrapy爬取数据,使用Django+PyEcharts实现可视化大屏

项目介绍 使用Scrapy进行数据爬取,MySQL存储数据,Django写后端服务,PyEcharts制作可视化图表,效果如下。 项目下载地址:Scrapy爬取数据,并使用Django框架PyEcharts实现可视化大屏 发现每个模块都有详情页…

Django---------创建、运行

目录 1.安装django 2.pycharm(专业版)创建项目 3.默认项目的文件介绍 4.App的创建和说明 5. 启动运行django 1.确保app已注册[settings.py] 2. 编写URL和视图函数对应关系[url.py] 3.编写视图函数[views.py] 4.启动django项目 1.安装django pip…

C语言之函数栈帧的创建与销毁讲解(1)

在前期的学习中我们可能有很多困惑 例如:局部变量是怎么创建的 为什么局部变量的值是随机值 函数是怎么样传参的 传参的顺序是什么 形参和实参的关系是什么 函数调用是怎么做的 函数掉调用结束后怎么返回的 这篇博客我们来修炼自己的内功,掌握好这篇…

MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法

MySQl学习(MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法 第四篇_MySQL中常用的运算符及其用法运算符1. 算术运算符1.加法与减法运算符2.乘法与除法运算符3.求模(求余&#…

【Linux】在工作站或服务器上实现多个GUI图形界面同时进行操作,多个用户同时操作互不干扰

一、问题背景 因为我们团队有几个人需要做仿真,一个工作站不够用,经常是一个人操作的时候另一个人就眼巴巴等着。 我在想能不能实现一种方案,能使两个人一起操作仿真软件呢? 这种方案,目前网上比较流行是x11-forwar…

NLP——ELMO;BERT;Transformers

文章目录 ELMOELMO 简介ELMO 优点利用了多层的 hidden 表示ELMO 缺点 BERTBERT V.S. ELMO两种预训练任务Object1: Masked Language ModelObject2: Next sentence prediction 训练细节如何使用 BERTBERT 应用——垃圾邮件分类 Transformerself-attentionMulti-head AttentionTra…

chatgpt赋能python:Python中如何判断奇偶数

Python中如何判断奇偶数 当我们在Python中编写程序时,有时需要判断一个数是奇数还是偶数,因为根据不同的情况,我们需要对不同的数值进行不同的处理。那么在Python中,该如何判断一个数是奇数还是偶数呢? 判断奇偶数的…

【JavaEE进阶】mybatis

目录: 一、Mybatis是什么 三个映射关系如下图: 二、mybatis的使用(前置工作简单案例) 第一步:导入MAVEN依赖 第二步: 在spring项目当中新建数据源 第三步:新建一个实体类,是和…

Shell编程规范与变量使用

目录 一、Shell编程概述 1.Shell脚本的概念 2.Shell脚本的应用场景 3.Shell的作用 4.Linux系统中支持的shell 二、Shell编程规范 1.编写Shell脚本规范步骤 2.Shell脚本执行方法 (1)以绝对路径执行(需要赋予脚本文件执行权限&#xf…

stable diffusion webui 文生图(txt2img)api接口调用(使用C#)

唠嗑 本次将跟读者讲一下如何通过C#请求sd webui api 【txt2img】接口,如果读者觉得文章有用,请给【点个赞】吧,有问题可以评论区提问。 实战 1.配置api启用参数 启动webui时,需加上【–api】 命令以保证api接口可以被调用。如…