阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

在 bash 中使用函数

280次阅读
没有评论

共计 2683 个字符,预计需要花费 7 分钟才能阅读完成。

导读 今天我们将介绍在 bash 中如何创建函数,以及函数中的返回值、传递参数等内容。

当你的 bash 脚本中代码非常多的时候,会看起来很混乱,其中有部分代码有可能是重复的。这个时候,可以使用函数来避免重复的代码。

今天我们将介绍在 bash 中如何创建函数,以及函数中的返回值、传递参数等内容。

在 bash 中创建函数

创建 bash 函数有两种不同的语法。最常用的方法如下:

function_name () {commands}

第二种方法不太常用,如下所示:

function function_name {commands}

在使用函数时,需要注意以下几点:

    除非被调用,否则函数永远不会被执行;
    函数必须先定义,然后才能被调用。

作为演示,我们创建一个 fun.sh 脚本,如下代码:

#!/bin/bash

hello () {echo "Hello World"}

hello
hello
hello

上述脚本中,我们定义了一个名为 hello 的函数,它将在终端上打印 Hello World。后面我们调用了三次 hello 函数,因此,运行脚本后,你会在屏幕上看到 Hello World 打印了三次:

$ ./fun.sh
Hello World
Hello World
Hello World
函数的返回值

在很多编程语言中,函数在调用时都会返回一个值,然而,在 bash 函数中没有返回值。

当函数执行完成时,会返回一个 $? 变量作为退出状态,0 表示成功执行,其他非零正整数(1 – 255)表示执行失败。

我们来写一个例子,命名为 error.sh,在其中写一个 return 语句,如下代码所示:​

#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"

执行结果如下:

$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0

因为有 return 0 这一行,所以即使函数中有 blabla 这一行的报错,error 函数还是返回了一个执行成功的状态码 0。

return 语句执行后,函数会被立即终止。

向 bash 函数传递参数

我们可以向函数传递参数,就像向​​ bash 脚本传递参数​​​一样。

作为演示,我们创建一个名为 iseven.sh 的脚本,如下所示:​

#!/bin/bash

iseven () {if [ $(($1 % 2)) -eq 0 ]; then
        echo "$1 is even."
    else
        echo "$1 is odd."
    fi
}

iseven 3
iseven 4
iseven 20
iseven 111

iseven() 函数判断数字是偶数还是奇数。在调用的时候,将参数放在函数名后面,函数执行的时候会读取 $1 来获取传递的参数。我们来执行一下:

$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

这里需要注意,bash 函数中的参数,和 bash 脚本的参数需要区分开来,看如下 funarg.sh 脚本:​

#!/bin/bash

fun () {echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"}

echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."

fun Yes 7

执行结果如下:

$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()

可以看到,同样是使用 $1 和 $2 来引用脚本参数和函数参数,当实际调用时,取值是不同的。

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

与大多数编程语言累死,bash 变量具有全局变量和局部变量之分。其中全局变量可以在任何位置方位到,而局部变量只能在其定义的函数中访问。

作为演示,看如下 scope.sh 脚本:​

#!/bin/bash

v1='A'
v2='B'

myfun() {
    local v1='C'
    v2='D'
    echo "Inside myfun(): v1: $v1, v2: $v2"}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

我们首先定义了两个全局变量 v1 和 v2,然后在 函数 myfun() 中,使用 local 关键字 定义了一个局部变量 v1,并修改了全局变量 v2。在不同的函数中,局部变量可以使用相同的变量名。

执行一下,结果如下:​

$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

由此,我们可以看到:

    如果局部变量的变量名与全局变量的变量名相同,那么局部变量优先级会更高;
    在函数中可以更改全局变量的值。
递归函数

递归函数是一个调用自身的函数。阶乘计算是递归函数的经典例子,看下面的脚本 factorial.sh:

#!/bin/bash

factorial () {if [ $1 -le 1]; then
        echo 1
    else
        last=$(factorial $(( $1 -1)))
        echo $(($1 * last))
    fi
}

echo -n "4! is:"
factorial 4
echo -n "5! is:"
factorial 5
echo -n "6! is:"
factorial 6

任何递归函数都要从一个基本条件开始,这个基本条件必须可以结束递归函数调用链。在 factorial() 函数中,基本条件为:

if [$1 -le 1]; then
    echo 1

然后导出阶乘函数的递归情况。要计算 n 的阶乘,其中 n 是大于 1 的正数,可以将 n 乘以 n-1 的阶乘:

factorial(n) = n * factorial(n-1)

使用上面那个公式来编写递归函数的算法:​

last=$(factorial $(( $1 -1)))
    echo $(($1 * last))

然后运行一下,检查运行结果:

$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2683字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7800857
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
这个开源软件130k的star数!让电脑轻松管理安卓手机的神器

这个开源软件130k的star数!让电脑轻松管理安卓手机的神器

这个开源软件 130k 的 star 数!让电脑轻松管理安卓手机的神器 大家好,我是星哥。今天给大家安利一款宝...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...