Shell编程--函数function

函数

  • 1.定义函数
  • 2.调用函数
    • 2.1.取消函数
    • 2.2.其他脚本调用
  • 3.函数传参

1.定义函数

函数声明:
function_name () {
    list of commands
}
函数名 function_name,这就是你将使用它从其他地方在你的脚本调用。
function (功能) 功能函数

  • 计算机函数:就是固定的模块、固定的功能做固定的操作,相当于linux中的固定的功能,当需要使用的时候,就去调用函数
  • ​作用:完成特定功能的代码片段(函数必须先定义才能使用)
  • 优点:避免重复的代码
  • 命名空间:在shell语言中命名空间函数内和函数外(不包括脚本)是一样的,函数内外不能赋值同样名字的变量
  • 变量:如果在同一个命名空间(同一个脚本内)可以用,如果不再同一个命名空间就不能用
  • 分开函数和shell的命名空间:如果不让在其他空间用使用,local 分开
  • 函数变量使用的范围:
        默认,函数里的变量会在函数外面生效(全局变量)
        local 变量名称(变量只在函数内生效,属于局部变量)
[root@localhost ~]# vim test.sh
a=10  # 全局变量
func1() {local b=20   # 局部变量echo $bc=30        # 全局变量
}
func1       #调用函数
echo $a   # 10
echo $b   # 错误,b是func1的局部变量
echo $c   # 30//a 是全局变量,能在整个脚本内用
//b 是func1的局部变量,只在func1内可用
//c 是全局变量,定义在func1内,但属于整个脚本的变量
[root@localhost ~]# bash test.sh
20
1030

总结
在同一命名空间(同一个shell脚本)内定义的变量,能全局使用
局部变量只在函数定义它的地方有效,出了这个函数,就无法使用。
​返回值:return value
value不能超过0-255,是函数里面函数最后一条执行命令的返回值,默认返回值是由这条命令执行结果确定的

[root@localhost ~]# vim re.sh
#!/usr/bin/bash
func(){echo "hello"# return 250 返回250并退出了函数,下面的语句不执行if [ $? -eq 0 ];thenreturn 250   #返回的是执行函数的返回值elsereturn 251fi
}
func1(){echo "hello"
}
func    #调用函数func
echo $?     #打印状态码,看看是否为250
func1    #调用函数func1
echo $?     #打印状态码,看看是否为0//执行
[root@localhost ~]# bash re.sh
hello
250
hello
0

总结
exit:返回结果并退出程序
return:返回结果并退出函数
函数的返回值,返回的是函数体内【最后一条命令】是否成功的返回值

[root@localhost ~]# systemctl stop httpd 
​[root@localhost ~]# systemctl stop vsftpd
​[root@localhost ~]# vim fun02.sh 
#!/bin/bash
fun() {systemctl status httpd &>/dev/nullsystemctl status vsftpd &>/dev/null
}
fun 
echo $?
​
​[root@localhost ~]# bash fun02.sh 
3

2.调用函数

2.1.取消函数

取消函数 unset myfunc

[root@localhost ~]# vim fun01.sh
#!/bin/bash
fun () {
echo "hello"
}
fun    #调用函数
unset fun   #取消函数
fun    #再次调用函数
​
[root@localhost ~]# bash fun01.sh 
hello
fun01.sh: line 7: fun: command not found

2.2.其他脚本调用

[root@localhost ~]# cat a.sh 
#!/usr/bin/bash
check_net() {echo "正在检查网络通信"ping -c1 www.baidu.com 2&> /dev/nullif [ $? -eq 0 ];thenecho "你的网络是没有问题的"elseecho "你的网络有问题,请先检查网络"exit 2fi
}
check_net
echo "+++++++++++++++++++++++++++++++++++++++++++++"check_yum() {echo "正在检查yum源是否可用"yum repolistif [ $? -eq 0 ];thenecho "你的yum源可以正常使用"elseecho "yum源不能用,请手动配置网络yum源"exit 3fi
}
#check_yum
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++"install_nginx() {
#检查网络是否可以上网
check_net
echo "正在配置nginx的yum源"
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
EOF
yum clean all && sleep 2
yum install -y nginx 2&> /dev/null
if [ $? -eq 0 ];thenecho "nginx install successfull and start nginx"sleep 2systemctl start nginxif [ $? -eq 0 ];thenecho "nginx started is success,plaess check port!"port=`netstat -lntp | grep nginx | awk '{print $4}' | awk -F ":" '{print $NF}'`echo "nginx is port $port"elseecho "nginx 启动失败,请手动检查!"exit 4fi
elseecho "nginx install failed!将会自动退出"exit 5
fi
}
#install_nginx//函数调用
[root@localhost ~]# cat b.sh #通过其他脚本调用函数脚本 
#!/usr/bin/bash
while :
do
echo "这是服务器基本检测功能脚本"
echo "
++++++++++++++++++++++++++++++++++
+       1. 检查yum源             +
+       2. 检查网络              +
+       3. 安装nginx             +
+       4. 退出                  +
++++++++++++++++++++++++++++++++++
"
source ./a.sh  #写你函数脚本的绝对路径,这里指的是执行函数脚本,让它为下面调用函数生效
read -p "请输入你的选项: " num
case $num in1)check_yum;;2)check_net;;3)install_nginx;;4)exit;;*)echo "你输入的选项失败请重新输入"
esac
done

3.函数传参

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

[root@localhost ~]# vim fun03.sh
#!/bin/bash
if [ ! $# -eq 3 ];thenecho "Must Input Three number: " p1 p2 p3
exit 
fi
fun() {echo $[$1*$2*$3] 
}
fun 1 2 3  #进行传参[root@localhost ~]# bash fun03.sh 1 3 4 6  //这个时候只是传参到了脚本,并没有传到函数里面 
Must Input Three number:  p1 p2 p3//修改版:
[root@localhost ~]# vim fun04.sh
fun() {echo $[$1*$2*$3]
}
fun $1 $2 $3[root@localhost ~]# bash fun04.sh 1 3 5
15

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

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

相关文章

C++ 异常处理

C++ 异常处理 实验介绍 所谓的异常便是程序中数据出现不合理的特殊情况处理,在做项目时我们常常需要想到的是特殊的情况,只有将所有的特殊情况处理好之后程序才能很好的运行。 那么异常处理跟多态有什么关系呢? C++ 标准库中已经存在异常处理类,并且就是使用了多态的方式…

Vue:多组件样式冲突问题解决

一、场景描述 我们在开发Vue项目的时候&#xff0c;会有很多的组件&#xff0c;每个组件里&#xff0c;可能都会写相应的样式&#xff0c;这时候就会出现在父组件引入子组件的时候&#xff0c;同名样式会冲突的问题。从而导致样式出问题。 二、解决办法 给style标签加上scop…

高效处理大数据集合:JavaStreamAPI

在当今数据驱动的世界中&#xff0c;处理大数据集合成为许多应用的核心需求。Java Stream API是Java 8及以后版本引入的一个强大工具&#xff0c;用于处理集合数据和数据流。它提供了一种简洁而高效的方式来操作和转换数据。在本文中&#xff0c;我们将探讨Java Stream API的基…

如何在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

某mps政务网站jsl加速乐cookie逆向解析

本文针对的目标网站如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cubXBzLmdvdi5jbi8 开篇&#xff1a;加速乐其实算是比较好处理的逆向问题了&#xff0c;了解过的朋友都知道&#xff0c;其本身跟瑞数相似&#xff0c;都是设置cookie后才能成功&#xff0c;设置cookie的过…

Python a-shape点云重建(alpha shapes)

目录 一、环境配置二、代码实现三、结果示例接上篇: Python 泊松重建(Poisson Surface Reconstruction) 一、环境配置 使用 pip install open3d 语句来安装open3d 使用 pip install open3d 语句来安装numpy 二、代码实现 import open3d as o3d import numpy as npdef a_sh…

ChatGPT会给教育界带来怎样的冲击,又将与教育碰撞出怎样的火花?

11 月 7 日凌晨&#xff0c;美国人工智能公司 OpenAI 的开发者大会正式开启&#xff0c;创始人 Sam Altman 和其同事&#xff0c;发布了团队最新的成果GPT-4 Turbo&#xff0c;新一代的GPT不仅更快、有更长的上下文、而且更好的控制。而随之推出的「GPTs」——让人们能用自然语…

炫云云模型常见咨询问题TOP榜

在上一期&#xff0c;小编带大家盘点了炫云云渲染软件相关常见咨询问题。这份榜单不仅是对过去一年用户关注焦点的回顾&#xff0c;更是一个汇总了各类问题解答的宝典。无论您是初次使用还是老用户&#xff0c;都能帮助您更快速地解决疑问&#xff0c;提升使用炫云各类产品的便…

Vs2019创建c文件

每一个人都是小白开始学习的&#xff0c;学长本身在开始学习计算机编程以前&#xff0c;也是对编程语言畏之如虎&#xff0c;一头雾水。成长都是有规律的&#xff0c;&#xff0c;都是从不会到会&#xff0c;再从会到熟练。如果要问我为什么&#xff0c;唯有多练习耳&#xff0…

分布式引擎Elasticsearch本地部署并结合内网穿透远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LeetCode-1822/1502/896/13

1.数组元素积的符号&#xff08;1822&#xff09; 题目描述&#xff1a; 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组…

详解java中ArrayList

目录 前言 一、ArrayList是什么 二、ArrayList使用 1、ArrayList的构造 2 、ArrayList常见操作 3、 ArrayList的遍历 4、 ArrayList的扩容机制 三、来个练习 前言 当你看到这篇文章我觉得很好笑&#xff0c;因为我开始也不懂ArrayList现在轮到你了&#xff0c;嘻嘻嘻&am…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…

001讲:CAD对话框出现乱码解决方案——CAD知识讲堂

CAD对话框中字体乱码的解决办法&#xff1a; 删掉CAD安装文件目录font字体库的 simsun.ttc 文件&#xff0c;然后彻底关闭CAD&#xff0c;重新打开cad即可解决问题。 如果还不行&#xff0c;对话框出现乱码原来是拷贝CAD字体中存在.TTC和*.TTF格式文件的问题&#xff0c;找到ca…

Egg框架搭建后台服务【1】

需求 博客系统升级&#xff0c;本来是用 express 写的&#xff0c;最近发现 Egg 不错&#xff0c;正好学习升级一下。边学边写。 Ps&#xff1a;相同的功能&#xff0c;迭代的写法&#xff0c;由浅入深&#xff0c;做个记录。 开发 初始化 安装 node版本需要 >14.20.0…

Redis未授权访问漏洞复现与工具安装

目录 一、漏洞简介 二、靶场搭建 三、漏洞检测 四、工具安装 五、远程连接 六、利用Redis写入webshell 七、redis-getShell工具 八、ssh公私钥免密登录 九、其他 一、漏洞简介 redis是一个数据库&#xff0c;默认端口是6379&#xff0c;redis默认是没有密码验证的&…

了解Python中的requests.Session对象及其用途

前言 在Python的网络编程中&#xff0c;requests库是一个非常流行的HTTP客户端库&#xff0c;用于发送各种类型的HTTP请求。在requests库中&#xff0c;requests.Session对象提供了一种在多个请求之间保持状态的方法本文将探讨Python中的requests.Session对象及其用途&#xf…

.net core 6 集成和使用 mongodb

1、安装包 MongoDB.Driver 2、定义顶层类 /// <summary> /// monggodb规范 /// </summary> public abstract class MongoDBToolBase { /// <summary> /// 客户端 /// </summary> protected MongoClient mongoClient { get; private …

联想电脑打开视频显示禁止相机排查

场景&#xff1a; ** 原因排查&#xff1a; ** windows设置>隐私> 电脑 联想管家 > 电池管理

GPT-4:人工智能的新纪元与未来的无限可能

在人工智能的发展史上&#xff0c;GPT-4的问世标志着一个新的里程碑。作为最新一代的自然语言处理模型&#xff0c;GPT-4不仅在技术上取得了突破&#xff0c;更在应用层面展现了前所未有的潜力。本文将探讨GPT-4的核心技术、应用场景以及它对未来社会的潜在影响。 GPT-4的技术…