如何在 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,一经查实,立即删除!

相关文章

CSS 选择器:精通网页样式的基础

CSS 选择器:精通网页样式的基础 CSS(层叠样式表)是网页设计中不可或缺的一部分,它用于控制网页元素的布局和外观。CSS 选择器是其中的核心概念,它允许开发者精确地指定要应用样式的 HTML 元素。本文将深入探讨 CSS 选…

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…

力扣 hot100 -- 多维动态规划

👇woc,这不是最熟悉那种,记忆化 dfs 或者 普通的深度优先搜索??都适用于二维地图👇 DFS(深度优先搜索)8种题型_dfs典型问题-CSDN博客 目录 🥃不同路径 🌼最…

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…

C++ 入门09:友元函数和友元类

往期回顾: C 入门06:类的进阶(构造函数的重载与拷贝构造函数)-CSDN博客 C 入门07:静态成员和常量成员-CSDN博客 C 入门08:运算符重载-CSDN博客 一、前言 在前面文章的学习中,我们了解了类和对象…

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

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

第九届MathorCup高校数学建模挑战赛-A题:基于数据驱动的城市轨道交通网络优化研究

目录 摘 要 一、 问题的提出 二、 基本假设 三、 符号说明 四、 问题分析 4.1 问题 1 的分析 4.2 问题 2 的分析 4.3 问题 3 的分析 4.4 问题 4 的分析 五、 问题 1 的模型建立与求解 5.1 问题分析 5.2 数据处理 5.2.1 数据统计 5.2.2 异常数据处理方法 5.2.3 剔除异常数据值 5…

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

了解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 代码很好地结合&…