如何在 Shell 脚本中使用函数 ?

How to define and use functions in Linux Shell Script

函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中,并从不同的地方调用该函数,库是函数的集合。我们可以在库中定义常用的函数,其他脚本可以使用它们而无需复制代码。

Calling function

在 Shell 中,调用函数和调用其他命令完全相同。例如,如果你的函数名是 my_func,那么它可以像下面这样执行。

$ my_func

如果函数接受参数,则可以从命令行提供这些参数,如下所示:

$ my_func arg1 arg2 arg3

Defining function

使用下面的语法来定义函数:

function function_name {Body of function}

函数体可以包含任何有效的命令、循环约束、其他函数或脚本,我们创建一个显示消息的简单函数。

function print_msg {echo "Hello, World"}

现在让我们执行这个函数:

$ print_msgHello, World

在上面的例子中,我们直接在终端上创建了函数,我们也可以将这个函数存储在文件中。

#! /bin/bashfunction print_msg {echo "Hello, World"}print_msg

我们在 function.sh 文件中定义了这个函数,现在让我们执行这个脚本:

$ chmod +x function.sh$ ./function.shHello, World

More about functions

在前一节中,我们定义了非常基本的函数。然而,在软件开发过程中,我们需要更高级的功能,可以接受各种参数和返回值。在本节中,我们将讨论这些函数。

向函数传递参数

和其他命令的参数一样,我们可以给函数提供相同的参数。我们可以使用 $ 符号从函数中访问这些参数。例如,$1 表示第一个参数,$2 表示第二个参数,依此类推。

修改上面的函数以接受 message 作为参数,修改后的函数如下:

function print_msg {echo "Hello $1"}

在上面的函数中,我们使用 $1 访问第一个参数。让我们执行这个函数:

$ print_msg "LinuxTechi"

当执行此函数时,它将生成以下输出:

Hello LinuxTechi

从函数返回值

像其他编程语言一样,Bash 提供了返回语句,我们可以使用它将值返回给调用者。

function func_return_value {return 10}

上面的函数返回值 10 给它的调用者。让我们执行这个函数:

$ func_return_value$ echo "Value returned by function is: $?"

当您执行上面的函数时,它将生成以下输出:

Value returned by function is: 10

注意: 在 bash 中我们必须使用 $?捕获函数的返回值。

Function recipes

到目前为止,我们对 bash 函数有了很好的了解。现在让我们创建一些有用的 bash 函数,它们可以使我们的工作更轻松。

Logger

让我们创建 logger 函数,它将打印日期和时间以及日志消息。

function log_msg {echo "[`date '+ %F %T'` ]: $@"}

让我们执行这个函数:

$ log_msg "This is sample log message"

当您执行此函数时,它将生成以下输出:

[ 2018-08-16 19:56:34 ]: This is sample log message

显示系统信息

Let us create a function to display information about GNU/Linux system

function system_info {echo "### OS information ###"lsb_release -aechoecho "### Processor information ###"processor=`grep -wc "processor" /proc/cpuinfo`model=`grep -w "model name" /proc/cpuinfo  | awk -F: '{print $2}'`echo "Processor = $processor"echo "Model     = $model"echoecho "### Memory information ###"total=`grep -w "MemTotal" /proc/meminfo | awk '{print $2}'`free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'`echo "Total memory: $total kB"echo "Free memory : $free kB"}

当您执行上面的函数时,它将生成以下输出:

### OS information ###
No LSB modules are available.
Distributor ID:           Ubuntu
Description:   Ubuntu 18.04.1 LTS
Release:         18.04
Codename:    bionic### Processor information ###
Processor = 1
Model     =  Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz### Memory information ###
Total memory: 4015648 kB
Free memory : 2915428 kB

从当前目录中查找文件或目录

下面的函数从当前目录中搜索文件或目录

function search {find . -name $1}

让我们使用下面的命令搜索目录 dir4

$ search dir4

当您执行上述命令时,它将生成以下输出:

./dir1/dir2/dir3/dir4

数字时钟

下面的函数在终端上创建一个简单的数字时钟

function digital_clock {clearwhile [ 1 ]dodate +'%T'sleep 1cleardone}

Creating library

库是函数的集合,在文件中创建库定义函数,并在当前环境中导入该文件。

假设我们已经在 utils.sh 文件中定义了所有函数,然后使用下面的命令在当前环境中导入函数。

$ source utils.sh

此后,您可以像执行其他 bash 命令一样执行库中的任何函数。

我的开源项目

酷瓜云课堂-开源知识付费解决方案

  • course-tencent-cloud(酷瓜云课堂 - gitee仓库)
  • course-tencent-cloud(酷瓜云课堂 - github仓库)

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

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

相关文章

1.33、激活可视化卷积神经网络(matalb)

1、激活可视化卷积神经网络原理及流程 激活可视化(Activation Visualization)指的是通过可视化神经网络中激活函数的输出,来理解神经网络是如何学习并提取特征的过程。在卷积神经网络(CNN)中,我们可以通过…

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强,大项目不适应tomcat做为转发动态的中间件(k8s集群,pytnon rubby),小项目会使用(内部使用的)动静分离 默认配置不适合生产环境&…

MySQl高级篇 -索引优化篇

索引 InnoDB采用了一个B数来存储索引,使得在千万级数据量的一个情况下,树的高度可以控制在3层以内,而层高代表磁盘IO的一个次数,因此基于索引查找可以减少磁盘IO的次数 MySQL的索引是在存储引擎层实现的,不同的存储引…

头歌资源库(31)象棋中马遍历棋盘的问题

一、 问题描述 二、算法思想 这是一个典型的深度优先搜索问题。 首先,我们创建一个mn的棋盘,并初始化所有的点为未访问状态。 然后,我们从(0, 0)位置开始进行深度优先搜索。 在每一步中,我们先标记当前位置为已访问&#xff0…

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只,内容变化已多单一的fragment,变成连续的,特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动,到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久,网上的方法基本上都试过了,终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

基于Python+Django+MySQL+Echarts的租房数据可视化分析系统

租房数据可视化 DjangoMySQLEcharts 基于PythonDjangoMySQLEcharts的租房数据可视化分析系统 Echarts 信息存储在数据库中 不含爬虫代码,或爬虫代码已失效 不支持登录注册 简介 基于DjangoMySQLEcharts的租房数据可视化系统通过连接数据库获取数据&#xff0c…

【格密码基础】旋转格的性质

目录 一. 回顾ZSVP问题 二. 基于ZSVP问题的密码系统 三. 格基旋转与Gram矩阵 四. 补充矩阵QR分解 4.1 矩阵分解 4.2 举例 前序文章请参考: 【格密码基础】详解ZSVP问题-CSDN博客 一. 回顾ZSVP问题 根据之前的讨论我们知道解决ZSVP问题的计算复杂度为&#x…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP,后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案,可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署!加密通道!牢牢掌握通…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA? 《网络弹性法案》(CRA)是即将出台的欧盟法规,旨在确保在欧盟销售的所有数字产品和服务(如连接到互联网的软件和硬件)都采用强大的网络安全措施。 该法案要求…

【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】

欢迎来到CILMY23的博客 🏆本篇主题为:【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux…

Chrome浏览器的Profile数据内容简介

前文简介了Chrome存储的账密/Cookie数据:一段代码读取Chrome存储的所有账号密码和Cookie 本文再扩展介绍一下Chrome存储的其它一些隐私数据。 注:因为业务需要,简单调研了一些基本内容和存储路径,没有深入去研究,有啥…

新160个crackme - 002-abexcm5

运行分析 猜测需要输入正确序列号 PE分析 32位,ASM程序,无壳 静态分析 ida shift F12 ,发现字符串定位主函数 分析主函数 lstrcat:拼接字符串 lstrcmpiA:比较字符串 动态调试 serial输入123456调试 发现序列号…

Codeforces Round 957 (Div. 3)(A~D题)

A. Only Pluses 思路: 优先增加最小的数&#xff0c;它们的乘积会是最优,假如只有两个数a和b&#xff0c;b>a&#xff0c;那么a 1&#xff0c;就增加一份b。如果b 1&#xff0c;只能增加1份a。因为 b > a&#xff0c;所以增加小的数是最优的。 代码: #include<bi…

Spring Boot集成groovy快速入门Demo

1.什么是groovy&#xff1f; Groovy 是构建在 JVM 上的一个轻量级却强大的动态语言&#xff0c;它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。 Groovy 就是用 Java 写的&#xff0c;Groovy 语法与 Java 语法类似&#xff0c;Groovy 代码能够与 Java 代码很好地结合&…

STM32MP135裸机编程:定时器内核时钟频率计算方法

0 工具准备 STM32MP13xx参考手册 1 定时器内核时钟频率计算方法 1.1 定时器分组 STM32MP135的定时器按照时钟源不同分成了三组&#xff0c;如下&#xff1a; APB1: APB2: APB6&#xff1a; 1.2 定时器内核时钟频率计算方法 APB1DIV是APB1的分频系数&#xff0c;APB2DIV、…

python双下划线怎么打

连续按键盘上的“shift_”键两次即可&#xff0c;不同编辑器可能显示会不太一样。像图1中那样没连起来也是对的&#xff0c;没有语法错误。

基于python豆瓣电影爬虫数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+详细部署教程)

文章目录 基于python豆瓣电影爬虫数据可视化分析推荐系统&#xff08;完整系统源码数据库详细文档论文详细部署教程&#xff09;一、 选题背景二、研究目的三、开发技术介绍1、Django框架2、LDA3、机器学习推荐算法4、大数据爬虫5、大数据Echarts可视化 四、系统设计思想五、部…

C++ | Leetcode C++题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor->val) {anc…

贪心算法案例

1.买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…