Shell脚本函数简介及运用(喜欢,适合,能在一起,是三码事)

news2025/1/16 21:17:17

一、函数的作用

语句块定义成函数约等于别名,定义函数,再引用函数
封装的可重复利用的具有特定功能的代码

二、定义函数

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

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取余。

在这里插入图片描述

[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/501137.html

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

相关文章

快速原型设计工具(Axure)的安装、汉化

〇、一些名词解释: 1. 草图 一般主要用于产品整理思路,寻找灵感,或者在产品团队内部互相讨论碰撞火花时使用。画 给自己看的,想怎么画就怎么画。 2. 低保真 打个比喻来说就像,用于“生产的图纸”,要简单易读…

Postgres:Win/Linux环境安装及一键部署脚本

1.Win安装Postgres (1)下载安装包 (2)开始安装 修改安装目录 选择要安装的组件 data也就是库表及数据的.dba文件存放目录 密码设置 端口设置 next next 开始安装 安装完成,Stack Builder 根据需要选择是否安装。仅仅是…

03-Docker容器命令

新建启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用的参数: --namenew_name:为容器指定一个名称-d:后台运行容器并返回容器ID,即启动守护式容器-i:以交互模式(interactive)运行…

【三十天精通Vue 3】第二十九天 Vue 3中的Mock数据模拟详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Mock数据模拟的概述1.1 为什么需要Mock数据模拟?1.2 Mock数据模拟的优点和缺点二、安装和配置Mock.js库2.1 使用NPM安…

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法 前面和大家分享了博途Wincc中配方功能的具体使用方法,具体内容可参考以下链接中的内容: TIA博途Wincc中自定义配方画面的具体方法示例 上面的例子中,向PLC写入数据时是通过点击屏幕上的按钮来实现…

scrapy爬虫标准流程

Scrapy爬虫的标准流程一般包括以下几个步骤: 1、明确需求和目标网站的结构,确定需要爬取的数据以及爬取规则。 2、创建一个Scrapy项目,使用命令行工具创建一个新的Scrapy项目。 3、定义数据模型和item,即确定要爬取的数据结构。…

基于SpringBoot开发的仓库管理系统

系统概要 仓库管理系统总共分为两个大的模块,分别是系统模块和业务模块。其中系统模块和业务模块底下又有其子模块。 功能模块 一、业务模块 1、客户管理 客户列表 客户分页和模糊查询 客户添加、修改、删除、批量删除 2、供应商管理 供应商列表 供应商分…

sql注入合集

1.Access注入 http://110.40.154.212:8002/Production/PRODUCT_DETAIL.asp?id1513 and exists(select count(*) from admin) #存在admin表,继续爆,还存在job,email,product等http://110.40.154.212:8002/Production/PRODUCT_DETAIL.asp?id1513 and e…

软考A计划-重点考点-专题二(程序语言)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

GP04丨网格框架初版

量化策略开发,高质量社群,交易思路分享等相关内容 正文 大家好,今天我们分享股票社群第4期量化策略——网格策略。 在上一期中,我们分享了ETF轮动策略Plus版本(基于资金管理的ETF增强策略),本…

Linux-Day02

Linux-Day02 课程内容 软件安装 项目部署 1. 软件安装 1.1 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压&am…

哪种蓝牙耳机音质最好佩戴舒服?佩戴舒适音质好的蓝牙耳机

蓝牙无线耳机基本成为了大家的标配,大多数 对于外观与舒适性十分看重,如今的蓝牙耳机市场已经很成熟了,基本能满足大多数人,下面就来分享几款佩戴并且音质表现也不错的蓝牙耳机。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#xf…

【机器人仿真Webots教程】-控制器编程指南

Webots controller编程指南 文章目录 Webots controller编程指南1. controller程序设计流程1.1 controller与场景树节点1.2 进程角度分析1.3 仿真时间步长与控制器程序更新延时步长 2. 例解控制器编程2.1 Hello world 实例2.2 传感器读取实例2.3 执行器的使用2.4 传感器与执行器…

距离保护整定计算中分支系数公式理解

在一般的距离保护II段和III段的整定计算中,分支系数的计算是必须要的,本文选自电力系统继电保护(第二版)(张保会老师主编)P94-P97页的例题,分析其中分支系数的计算公式。 我们在前面的章节中知道…

springboot+jsp影院管理系统9ufid电影票预订管理系统

项目介绍开发语言:Java 框架:springboot 技术:JSP JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器:谷歌浏览器 功能介绍 主要对…

HTB靶机08-Nineveh-WP

008-nineveh 靶机IP: 10.10.10.43 scan Nmap 扫描 ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.43 -p- Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-07 17:40 CST Nmap scan report for nineveh.htb (10.10.10.43) Host is up (0.34s …

linux系统安装nginx 支持ssl

目录 1. 开放80端口和443端口 2. 安装nginx的基础环境 -> 2.1 安装gcc-c编译器 -> 2.2 安装pcre包 -> 2.3 安装zlib包(可能安装过) 3. 安装nginx -> 3.1 创建文件夹 -> 3.2 在官网下载nginx包到服务器内 -> 3.3 解压tar.gz,并进入nginx-1.19.9 -&g…

[数据库系统] 二、表的基本操作(educoder)

目录 第一关:修改表名 一、知识点 ①查看所有表:show tables; ②查看表基本结构:DESCRIBE 表名; 或 简写为 desc 表名; ③查看创建表的语句:SHOW CREATE TABLE 二、educoder 第二关: 修改表结构-1 一、…

面对AI“龙卷风”破坏力 白宫“软着陆”欧盟“硬防御”

ChatGPT的风靡与风险将OpenAI的CEO山姆奥特曼(Sam Altman)送进白宫,他被蹲守在美国总统府邸的记者们围追,面对5月4日白宫发起的AI风险治理会议,奥特曼很官方地给出“重要也很及时”的回应,自信的反复强调“…

【TCP三次握手】

文章目录 TCP基本认识TCP头部格式为什么需要 TCP 协议? TCP 工作在哪一层?什么是 TCP ?如何唯一确定一个 TCPUDP 和 TCP 有什么区别呢?分别的应用场景是?TCP 和 UDP 可以使用同一个端口吗? TCP连接建立TCP三…