当前位置: 首页 > news >正文

Shell 编程-Shell 函数你学会了吗?

今天给伙伴们分享一下Shell 编程-Shell 函数,希望看了有所收获。

我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!

如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相关文档。爱运维,爱生活。

  • Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可
  • 松耦合的概念 代码之间的依赖关系

1、定义函数

  • 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
# 方法一
function name {commands[return value]
}
# 方法二
name() {commands[return value]
}
  • function 是 Shell 中的关键字,专门用来定义函数;

  • name 是函数名;

  • commands 是函数要执行的代码,也就是一组语句;

  • return value 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。

  • 由 { } 包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

  • 函数的优势

    • 方便n次使用,减少代码量,使之方便,整洁。
    • 当需要修改里面的重复代码时,只需要修改一次函数即可实现需求;
    • 将函数写进文件,需要时直接通过文件调用
f1.sh   f2.sh
fu1()   fu3()
fu2()   fu4()source f2.sh  # f2 没有调用函数
fu1
fu2
fu3

2、调用函数

1、执行不带参数的函数
  • 直接输入函数名即可,不需要带括号,
functionName
  • 执行函数时,函数名前的关键字function和函数名后面的()均不需要带
  • 函数的定义必须要在执行的程序前定义或加载
2、执行带参数的函数
functionName arg1 arg2
  • Shell中的位置参数($1/ 2... / 2.../ 2.../#/ ? / ?/ ?/@)均可以做为函数的参数进行传递
  • $0比较特殊,仍然是父脚本的名称
  • 此时父脚本的参数会临时被函数的参数所掩盖或隐藏
  • 函数的参数变量是在函数体内里面进行定义
3、函数的执行总结
  • Shell各种程序的执行顺序为:系统别名->函数->系统命令->可执行文件等
  • 函数执行时,会和调用它的脚本共享变量,也可以为函数设定局部变量及特殊位置参数
  • 在Shell函数里面,return和exit功能类似,区别是return是退出函数,exit则是退出脚本
  • return语句会返回一个值给调用函数的程序,exit则会返回一个值给执行当前脚本的Shell
  • 如果将函数单独存放为一个文件,在加载时需要使用source或 . 进行加载
  • 在函数内部一般使用local定义局部变量,仅在函数体内有效
4、调用函数
[root@edenluo.com  ~]# cat testfunction.sh
#!/bin/bash
# first function
function HelloWorld() {echo "Hello world"
}
# second function
Welcome() {echo "Welcome to edenluo"
}
# third function
function HelloShell {echo "Hello Shell"
}
# file functions
HelloWorld               # 调用函数
Welcome
HelloShell
[root@edenluo.com  ~]# bash testfunction.sh
Hello world
Welcome to edenluo
Hello Shell
5、从文件中调用函数
[root@edenluo.com  ~]# cat filefunction.sh
function Sum () {for((i=1;i<=100;i++))do((sum=sum+i))  doneecho '{1..100} sum is :' $sum
}
[root@edenluo.com  ~]# cat filefunctionfromfile.sh
#!/bin/bash
path="/root/Test/filefunction.sh"
if [ -f ${path}

http://www.mrgr.cn/news/58144.html

相关文章:

  • react18中的计算属性及useMemo的性能优化技巧
  • LinkedList和链表之刷题课(下)
  • 医院信息化与智能化系统(7)
  • Lua简介
  • C++初阶学习第八弹--深入解析vector的使用
  • 深入解析POP3协议:电子邮件接收的基石
  • 【含开题报告+文档+PPT+源码】社区医院预约挂号看病系统的设计与实现
  • python回调函数概念及应用场景举例
  • 于Java语言 Netty通讯框架的云块充协议1.5_云快充协议1.6_云快充协议1.4_云快充协议
  • Flutter TextField和Button组件开发登录页面案例
  • 【赵渝强老师】Hive的内部表与外部表
  • TreeMap详解
  • 产品推介——LSOP4晶体管光耦KL101X
  • web 请求日志追踪(traceID)提升运维效率
  • Nexpose 6.6.274 发布下载,新增功能概览
  • 华为OD机试 - 创建二叉树(Java 2024 E卷 200分)
  • 基于Java+SpringBoot+Vue的宠物咖啡馆平台的设计与实现
  • JavaScript 中四种常见的数据类型判断方法
  • 【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper+代码——交叉注意力(Cross-Attention)
  • 附录章节:SQL标准与方言对比
  • 【已解决】【hadoop】如何解决Hive连接MySQL元数据库的依赖问题
  • 【C++】位图
  • ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)
  • C/C++(六)多态
  • OpenCV KeyPoint与描述子编解码
  • rtsp的2种收流模式