服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Bash 初学者系列 #1:在 Bash 中使用函数

日期: 来源:Linux公社收集编辑:聆听世界的鱼

点击上方蓝字 ● 关注Linux公社     

当您的 bash 脚本变得越来越大时,事情会变得非常混乱!
您可能会发现自己在 bash 脚本的不同部分一次又一次地重写相同的代码片段。
幸运的是,您可以通过在 bash 中使用函数来避免重写代码,这将使您的脚本更有组织性和可读性。
在本教程中,您将学习在 bash shell 脚本中创建函数、返回函数值和传递函数参数。
此外,您将了解变量作用域如何工作以及如何定义递归函数。

在 bash 中创建函数

声明 bash 函数有两种不同的语法。以下语法是创建 bash 函数最常用的方法:
function_name () {commands}
第二种不太常用的创建 bash 函数的方法是从保留的工作函数开始,后跟函数名称,如下所示:
function function_name {commands}
在使用函数时,您应该清楚以下几点:
  • 除非您调用函数,否则函数永远不会运行/执行。
  • 函数定义必须先于对该函数的任何调用。
任何时候你想要一个函数运行,你只需要调用它!函数调用是通过简单地引用函数名来完成的。
看看下面的linuxmi.sh bash 脚本:
#!/bin/bash
hello () {echo "Hello World! Linux迷 www.linuxmi.com"}
hellohellohello
我定义了一个名为 hello 的函数,它只是将“Hello World”行回显到终端。请注意,我执行了三个 hello 函数调用,因此如果您运行该脚本,您将看到屏幕上打印了三次“Hello World”行:

在 bash 中返回函数值

在许多编程语言中,函数在调用时确实会返回一个值;但是,bash 不是这种情况,因为 bash 函数不返回值。
当 bash 函数完成执行时,它返回在 $? 多变的。零表示执行成功或非零正整数 (1-255) 表示失败。
您可以使用 return 语句来更改函数的退出状态。例如,查看以下 linuxmi.sh 脚本:
#! /bin/bash//Linux迷 www.linuxmi.comerror () {blablareturn 0}
errorecho "错误函数的返回状态为: $?"
如果运行 linuxmi.sh bash 脚本,您可能会对输出感到惊讶:
如果没有return 0语句,error函数将永远不会返回非零退出状态,因为 blabla 会导致 未找到命令 错误。
正如您所看到的,即使 bash 函数不返回值,我还是通过改变函数退出状态来解决这个问题。
您还应该知道 return 语句会立即终止函数。

将参数传递给 bash 函数

您可以将参数传递给函数,就像您可以将参数传递给 bash 脚本一样。您只需在执行函数调用时包含参数。
为了演示,让我们看一下以下www.linuxmi.com.sh bash 脚本:
#!/bin/bash#Linux迷 www.linuxmi.comiseven () {if [ $(($1 % 2)) -eq 0 ]; thenecho "$1 是偶数。"elseecho "$1 是奇数。"fi}
iseven 5iseven 2iseven 28iseven 199
iseven() 函数测试数字是偶数还是奇数。我对 iseven() 进行了四次函数调用。对于每个函数调用,我提供了一个数字,它是对 iseven() 函数的第一个扩充,并由函数定义中的 $1 变量引用。
让我们运行 www.linuxmi.com.sh bash 脚本以确保其正常工作:
您还应该清楚 bash 函数参数和bash 脚本参数是两个不同的东西。为了对比差异,请查看以下 linuxmi.sh bash 脚本:
#!/bin/bash#Linux迷 www.linuxmi.comfun () {echo "$1 是 fun() 第一个参数。"echo "$2 是 fun() 第二个参数。"}
echo "$1 是脚本的第一个参数。"echo "$2 是脚本的第二个参数。"
fun linuxmi 93139
使用几个参数运行脚本并观察结果:
如您所见,即使您使用相同的变量 $1 和 $2 来引用脚本参数和函数参数,当从函数内调用时它们会产生不同的结果。

bash 函数中的局部变量和全局变量

Bash 变量可以具有全局或局部作用域。无论范围如何,您都可以在 bash 脚本中的任何位置访问全局变量。相反,局部变量只能从它们的函数定义中访问。
为了演示,请查看以下linuxmi.com.sh bash 脚本:
#!/bin/bash#Linux迷 www.linuxmi.coma1='X'a2='Y'
myfun() {local v1='Z'v2='W'echo "Inside myfun(): a1: $a1, a2: $a2"}
echo "Before calling myfun(): v1: $a1, a2: $a2"myfunecho "After calling myfun(): a1: $a1, a2: $a2"
我首先定义了两个全局变量a1a2。然后在myfun()定义中,我使用local关键字定义了一个局部变量a1并修改了全局变量a2。请注意,您可以为不同函数中的局部变量使用相同的变量名。
现在让我们运行脚本:
从脚本输出中,您可以得出以下结论:
  • 与全局变量同名的局部变量将优先于函数体内的全局变量。
  • 您可以从函数内更改全局变量。

递归函数

递归函数是一个调用自身的函数!当您尝试解决可以分解为更小的子问题的编程问题时,递归函数会派上用场。
阶乘函数是递归函数的一个典型例子。查看以下 linuxmi.com.sh bash 脚本:
#!/bin/bash#Linux迷 www.linuxmi.comfactorial () {if [ $1 -le 1 ]; thenecho 1elselast=$(factorial $(( $1 -1)))echo $(( $1 * last ))fi}
echo -n "4! is: "factorial 4echo -n "5! is: "factorial 5echo -n "6! is: "factorial 6
任何递归函数都必须以一个基本情况开始,该基本情况必然会结束递归函数调用链。在factorial()函数中,基本情况定义如下:
if [ $1 -le 1 ]; thenecho 1
现在推导阶乘函数的递归情况。要计算数字n的阶乘,其中n是大于 1 的正数,您可以将n乘以n-1的阶乘:
factorial(n) = n * factorial(n-1)
让我们使用上面的等式来编写这个递归案例:
last=$(factorial $(( $1 -1)))echo $(( $1 * last ))
现在运行脚本并确保获得正确的结果:
作为附加练习,尝试编写一个递归函数来计算第 n 个斐波那契数。首先,尝试提出基本情况,然后提出递归情况;你明白了吗!



感谢 Linux迷 www.linuxmi.com 的精彩分享。
OK,这就是本文的内容。如果还有什么疑问,请在下面的评论区告诉我们。
需要 Linux 精美艺术壁纸的朋友请加小编微信linuxgs口令壁纸)。
来自:Linux迷
链接:https://www.linuxmi.com/bash-1-functions.html
关注我们

长按或扫描下面二维码关注 Linux公社



关注 Linux公社,添加“ 星标 

每天 获取 技术干货,让我们一起成长

合作联系:root@linuxidc.net

相关阅读

  • 2023 年的 Web Worker 项目实践

  • 前言—Web Workers 是 2009 年就已经提案的老技术,但是在很多项目中的应用相对较少,常见一些文章讨论如何写 demo ,但很少有工程化和项目级别的实践,本文会结合 Web Workers 在
  • 细说 Vue 响应式原理的 10 个细节!

  • 在讲解之前,我们先了解一下数据响应式是什么?所谓数据响应式就是建立响应式数据与依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式
  • 在调用 createApp 时,Vue 为我们做了那些工作?

  • 在使用Vue3时,我们需要使用createApp来创建一个应用实例,然后使用mount方法将应用挂载到某个DOM节点上。那么在调用createApp时,Vue再背后做了些什么事情呢?今天就来扒一扒Vue3
  • 【2023春节】解题领红包 WP

  • 作者论坛账号:十一七Windows 初级题 1/23cpp逆向,简单移位 复制代码 隐藏代码bytearray([i >> 2 for i in [0x00000198, 0x000001B0, 0x00000184, 0x0000019C, 0x000001EC, 0x
  • 实战 | 绕过自定义SSP的凭证保护抓取密码

  • 0. 背景为了避免攻击者转储用户的凭据信息,从 Windows 10 1507 企业版和 Windows Server 2016 开始,微软引入了 Windows Defender Credential Guard 安全控制机制,其使用基于虚
  • 让你们久等了,低调不解释,尽快下载吧!

  • 前面给大家分享过几期有关 iOS 应用的推荐,得到了很多苹果用户的点赞,最近在公众号后台,我又收到了一部分粉丝的留言,有些人表示期待分享更多应用,那么今天就安排一波。Stay大家
  • 【设计模式】面试中被问的最频繁的「策略模式」

  • 模拟面试、简历指导可私信找我,最低的价格收获最高的指导~前言大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。什么是设计模式?为
  • 无缝切换?从Vue到React

  • 阿里妹导读本文主要针对Vue开发者或新手快速上手React。本文主要分析Vue和React在开发上的区别,帮助Vue开发者快速上手React,同时也适用于前端新手入门React。单文件组件 VS c

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 辣界“后浪”虎视眈眈,老干妈真“老”了?

  • ◎ 文 《法人》杂志全媒体记者 银昕“断网”许久之后,2月10日,老干妈在抖音发布了一条短视频,重回社交平台。此前有网友发现,国民辣酱品牌老干妈在社交平台上已消失许久:微博目前
  • Bash 初学者系列 #1:在 Bash 中使用函数

  • 点击上方蓝字 ● 关注Linux公社 当您的 bash 脚本变得越来越大时,事情会变得非常混乱!您可能会发现自己在 bash 脚本的不同部分一次又一次地重写相同的代码片段。幸运的是
  • Linux 只是一个内核:这意味着什么?

  • 点击上方蓝字 ● 关注Linux公社 这是困扰 Linux 用户的一个常见问题。这也是考试和面试中经常问的问题。以下是您需要了解的所有信息。您可能已经在互联网上看到和听到
  • 济南今年初步计划供地7万亩以上

  •   2月28日上午,济南市委市政府“凝心聚力抓项目 蓄势赋能促发展”主题系列新闻发布会第十三场举行。发布会上,市自然资源和规划局党组副书记、副局长牛长春围绕济南自然资源
  • Linux 中使用 Tee 和 Xargs 从标准输入运行命令

  • 点击上方蓝字 ● 关注Linux公社 使用命令行时,您可以直接将一个程序(例如生成某些系统信息或统计信息的工具)的输出作为另一个程序(例如文本过滤或模式搜索工具,如grep、sed