Bash 脚本编写第 6 部分 – 创建和使用 Bash 函数

2023-10-23

在讨论 bash 函数之前,我们先讨论一下这种情况。编写 bash 脚本时,您会发现自己在多个地方使用相同的代码。

如果您厌倦了在 bash 脚本中一次又一次地编写相同的代码行,那么最好编写一次代码块并在 bash 脚本中的任何位置调用它。

bash shell 允许你这样做功能.

bash 函数是一些代码块,您可以在代码中的任何位置重用它们。每当您想在脚本中使用此代码块时,只需键入为其指定的函数名称即可。

我们将讨论如何创建 bash 函数以及如何在 shell 脚本中使用它们。

 

 

创建函数

您可以像这样定义一个函数:


functionName() {
}  

需要使用方括号 () 来定义该函数。

另外,您可以使用 function 关键字定义函数,但为了 POSIX 可移植性,不推荐使用该关键字。


function functionName() {
	# Deprecated definition but still used and working
}  

在第二个定义中,不需要括号。

 

使用函数


#!/bin/bash
myfunc() {
	echo "Using functions"
}
total=1
while [ $total -le 3 ]; do
	myfunc
	total=$(($total + 1))
done
echo "Loop finished"
myfunc
echo "End of the script"  

在这里,我们创建了一个名为 myfunc 的函数,要调用它,我们只需输入它的名称即可。

您可以根据需要多次调用该函数。

注意:如果尝试使用未定义的函数,会发生什么?


#!/bin/bash
total=1
while [ $total -le 3 ]; do
	myfunc
	total=$(($total + 1))
done
echo "Loop End"
myfunc() {
	echo "Using function ..."
}
echo "End of the script"  

哦,这是一个错误,因为没有这样的功能。

另外注意:bash 函数名必须是唯一的。否则,新函数将取消旧函数而不会出现任何错误。


#!/bin/bash
myfunc() {
	echo "The first function definition"
}
myfunc
function myfunc() {
	echo "The second function definition"
}
myfunc
echo "End of the script"  

正如您所看到的,第二个函数定义从第一个函数定义中接管控制,没有任何错误,因此定义函数时要小心。

 

使用返回命令

return 命令从函数中返回一个整数。

有两种使用 return 命令的方法;第一种方法是这样的:


#!/bin/bash
myfunc() {
	read -p "Enter a value: " value
	echo "adding value"
	return $(($value + 10))
}
myfunc
echo "The new value is $?"  

myfunc 函数将 10 添加到 $value 变量,然后使用 $? 显示总和。多变的。

在获取函数值之前不要执行任何命令,因为变量 $?返回最后一行的状态。

此返回方法返回整数。返回字符串怎么样?

 

使用函数输出

从 Bash 函数返回值的第二种方法是命令替换。这样,您就可以从函数中返回任何内容。


#!/bin/bash
myfunc() {
	read -p "Enter a value: " value
	echo $(($value + 10))
}
result=$(myfunc)
echo "The value is $result"  

 

传递参数

我们可以像处理可重用的小片段一样处理 bash 函数,这没问题,但我们需要让函数像引擎一样,我们给它一些东西,它会根据我们提供的内容返回结果。

您可以使用环境变量来处理传递给函数的参数。函数名称声明为 $0 变量,传递的参数为 $1、$2、$3 等。

您可以获得传递参数的数量使用 ($#) 多变的。

我们像这样传递参数:


myfunc $val1 10 20  

以下示例显示如何使用 ($#) 变量:


#!/bin/bash
addnum() {
	if [ $# -gt 2 ]; then
		echo "Incorrect parameters passed" # If parameters no equal 2
	else
		echo $(($1 + $2)) # Otherwise add them
	fi
}
echo -n "Adding 10 and 15: "
value=$(addnum 10 15)
echo $value
echo -n "Adding three numbers: "
value=$(addnum 10 15 20)
echo $value  

addnum 函数获取传递参数的计数。如果传递的值大于 2,则返回 -1。

如果有一个参数,addnum 函数会将该参数相加两次。如果传递两个参数,addnum 函数会将它们加在一起,如果尝试添加三个参数,它将返回 -1。

如果您尝试在函数内使用传递的参数,则会失败:


#!/bin/bash
myfunc() {
	echo $(($1 + $2 + $3 + $4))
}
if [ $# -eq 4 ]; then
	value=$(myfunc)
	echo "Total= $value"
else
	echo "Passed parameters like this: myfunc a b c d"
fi  

相反,您必须将它们发送到如下函数:


#!/bin/bash
myfunc() {
	echo $(($1 + $2 + $3 + $4))
}
if [ $# -eq 4 ]; then
	value=$(myfunc $1 $2 $3 $4)
	echo "Total= $value"
else
	echo "Passed parameters like this: myfunc a b c d"
fi  

现在可以了!!

 

在 Bash 函数中处理变量

我们使用的每个变量都有一个范围;范围是脚本的可变可见性。

您可以定义两种类型的变量:

  • Global
  • Local

全局变量

它们在 bash 脚本中的任何位置都是可见且有效的。您甚至可以从函数内部获取它的值。

如果在函数内声明全局变量,则可以从函数外部获取其值。

默认情况下,您声明的任何变量都是全局变量。如果在函数外部定义变量,则在函数内部调用它不会出现问题:


#!/bin/bash
myfunc() {
	input=$(($input + 10))
}
read -p "Enter a number: " input
myfunc
echo "The new value is: $input"  

如果在函数内部更改变量值,则该值在函数外部也会更改。

那么如何克服这样的事情呢?使用局部变量。

局部变量

如果您仅在函数内部使用该变量,则可以使用 local 关键字将其声明为局部变量,如下所示:


local tmp=$(( $val + 10 ))  

因此,如果有两个变量,一个在函数内部,另一个在函数外部,并且它们具有相同的名称,则它们不会相互影响。


#!/bin/bash
myfunc() {
	local tmp=$(($val + 10))
	echo "The Temp from inside function is $tmp"
}
tmp=4
myfunc
echo "The temp from outside is $tmp"  

当您在 myfunc 函数内部使用 $tmp 变量时,它不会更改函数外部 $tmp 的值。

 

将数组作为参数传递

如果将数组作为参数传递给函数会发生什么:


#!/bin/bash
myfunc() {
	echo "The parameters are: $@"
	arr=$1
	echo "The received array is ${arr[*]}"
}
my_arr=(5 10 15)
echo "The old array is: ${my_arr[*]}"
myfunc ${my_arr[*]}  

该函数仅采用数组变量的第一个值。

您应该将数组分解为单个值,然后将这些值用作函数参数。最后,将它们打包到函数中的数组中,如下所示:


#!/bin/bash
myfunc() {
	local new_arr
	new_arr=("$@")
	echo "Updated value is: ${new_arr[*]}"
}
my_arr=(4 5 6)
echo "Old array is ${my_arr[*]}"
myfunc ${my_arr[*]}  

由于该函数,数组变量被重建。

 

递归函数

此功能使函数能够从函数本身内部调用自身。

递归函数的经典示例是计算阶乘。要计算 3 的阶乘,请使用以下等式:

3! = 1 * 2 * 3

相反,我们可以使用这样的递归函数:


x! = x * (x-1)!  

因此,要使用 bash 脚本编写阶乘函数,将如下所示:


#!/bin/bash
fac_func() {
	if [ $1 -eq 1 ]; then
		echo 1
	else
		local tmp=$(($1 - 1))
		local res=$(fac_func $tmp)
		echo $(($res * $1))
	fi
}
read -p "Enter value: " val
res=$(fac_func $val)
echo "The factorial of $val is: $res"  

使用递归 bash 函数是如此简单!

 

创建库

现在我们知道如何编写函数以及如何调用它们,但是如果您想怎么办在不同的 bash 脚本文件上使用这些 bash 函数或代码块无需将其复制并粘贴到您的文件中。

您可以为您的函数创建一个库,并根据需要从任何文件指向该库。

通过使用源命令,您可以将库文件脚本嵌入到 shell 脚本中。

source 命令有一个别名,即点. 要在 shell 脚本中获取文件,请编写以下行:


. ./myscript  

假设我们有一个名为 myfuncs 的文件,其中包含以下内容:


addnum() {
	echo $(($1 + $2 + $3 + $4))
}  

现在,我们将在另一个 bash 脚本文件中使用它,如下所示:


#!/bin/bash
. ./myfuncs
result=$(addnum 10 10 5 5)
echo "Total = $result"  

惊人的!!我们在 bash 脚本文件中使用了 bash 函数;我们也可以直接在 shell 中使用它们。

 

从命令行使用 Bash 函数

嗯,这很容易,如果你读过上一篇文章,那是关于信号和工作,您将了解如何在 bashrc 文件中获取函数文件,因此我们可以直接从 bash shell 使用函数。凉爽的

编辑位于 /home/username 的 bashrc 文件并添加以下行:


. /home/likegeeks/Desktop/myfuncs  

确保输入正确的路径。

现在我们可以直接在命令行中使用该函数了:


$ addnum 10 20  

注意:您可能需要注销并登录才能从 shell 中使用 bash 函数。

另请注意:如果您将函数名称设置为类似于任何内置命令,则会覆盖默认命令,因此您应该注意这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 脚本编写第 6 部分 – 创建和使用 Bash 函数 的相关文章

随机推荐

  • Bash 选择(制作菜单)

    在本教程中 我们将介绍以下基础知识select在 Bash 中构建 The select构造允许您生成菜单 Bash select构造 The select构造从项目列表生成菜单 它的语法几乎与for loop select ITEM in
  • 如何在 CentOS 7 上安装和配置 Redmine

    Redmine 是最流行的开源项目管理和问题跟踪软件工具之一 它是跨平台和跨数据库的 构建在 Ruby on Rails 框架之上 Redmine包括对多个项目 wiki 问题跟踪系统 论坛 日历 电子邮件通知等的支持 在本教程中 我们将介
  • 如何在 Ubuntu 18.04 上部署 Rocket.Chat

    Rocket Chat 是一个开源团队交流平台 是自托管的 Slack 替代品 它使用 Meteor 框架开发 提供各种功能 包括帮助台聊天 文件共享 视频会议 语音消息 API 等 对于想要托管自己的聊天系统的公司和社区来说 Rocket
  • .bashrc 与 .bash_profile

    如果您在命令行上花费大量时间 您很可能想要自定义您的 shell 环境 这可能意味着创建别名 将新目录添加到 PATH 或更改 shell 提示符的外观 您可能遇到过一些教程 其中他们说将您的配置放在 bashrc bash profile
  • 如何在 CentOS 7 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 它用于所有现代 PHP 框架和平台 例如 Laravel
  • 如何在 CentOS 8 上安装 Apache

    Apache HTTP 服务器是世界上使用最广泛的 Web 服务器 它是一个免费 开源 跨平台的HTTP服务器 具有强大的功能 并且可以通过多种模块进行扩展 在本文中 我们将解释如何在 CentOS 8 上安装和管理 Apache Web
  • 如何在 Debian 9 上安装 CouchDB

    CouchDB 是一个开源的容错且无模式的 NoSQL 数据库 由 Apache 软件基金会维护 CouchDB 服务器将其数据存储在命名数据库中 其中包含以下文档JSON结构 每个文档由许多字段和附件组成 字段可以包括文本 数字 列表 布
  • 如何在 CentOS 7 上安装 Visual Studio Code

    视觉工作室代码是微软开发的开源跨平台代码编辑器 它有一个内置的调试支持 嵌入式Git控制 语法突出显示 代码完成 集成终端 代码重构和片段 在 CentOS 计算机上安装 Visual Studio Code 最简单且推荐的方法是启用 VS
  • 如何在 Ubuntu 18.04 上安装 Mono

    Mono 是一个用于开发和运行基于 ECMA ISO 标准的跨平台应用程序的平台 它是 Microsoft NET 框架的免费开源实现 本教程介绍如何在 Ubuntu 18 04 上安装 Mono 先决条件 这些说明假定您以 root 身份
  • Linux中的su命令(切换用户)

    The su 替代或切换用户的缩写 实用程序允许您使用其他用户 默认为 root 用户 的权限运行命令 Using su是在当前登录会话中切换到管理帐户的最简单方法 当不允许 root 用户通过以下方式登录系统时 这尤其方便ssh或使用 G
  • Linux 中的Whereis命令

    whereis是一个命令行实用程序 允许您查找给定命令的二进制文件 源文件和手册页文件的位置 在这篇文章中 我们将向您展示如何使用Linuxwhereis命令 如何使用whereis命令 语法为whereis命令如下 whereis OPT
  • 在 CentOS 8 上使用 Let's Encrypt 保护 Nginx

    Let s Encrypt 是由互联网安全研究小组 ISRG 开发的免费 自动化 开放的证书颁发机构 提供免费的 SSL 证书 Let s Encrypt 颁发的证书受到所有主要浏览器的信任 并且自颁发之日起 90 天内有效 在本教程中 我
  • Expect 命令以及如何像魔术一样自动化 shell 脚本

    在上一篇文章中 我们讨论了写作实用的shell脚本 我们看到了编写 shell 脚本是多么容易 今天我们要讨论一个对 shell 脚本有神奇作用的工具 该工具是期待命令 or 期待脚本语言 Expect 命令或 Expect 脚本语言是一种
  • SSH 连接被拒绝(原因和解决方案)

    本教程将介绍您在使用 SSH 时可能遇到的最常见错误 连接被拒绝 请继续阅读 详细了解这个问题及其各种解决方案 Secure Shell SSH 是系统管理员最常用的工具之一 它对于管理所有服务器和执行日常任务至关重要 目录 hide 1
  • Linux env 命令:深入了解 Linux 环境管理

    The envLinux中的命令用于显示或设置环境变量 它可用于在修改后的环境中运行程序或显示当前环境 在本教程中 我们将深入研究其各种论点 并揭示其与脚本的集成 目录 hide 1 参数概览 2 执行不带参数的 env 命令 3 使用 e
  • 揭示 Linux 虚拟文件系统的强大功能

    Linux 虚拟文件系统或虚拟文件系统通常是位于实际文件系统之上的一层 它允许用户访问不同类型的文件系统 可以将虚拟文件系统视为内核与实际文件系统之间的接口 这意味着您将在 etc fstab 文件中找不到这些 Linux 虚拟文件系统的任
  • NumPy 随机种子(生成可预测的随机数)

    在计算科学中 随机种子是生成的伪随机数序列的起点 这些数字看似随机 但它们遵循确定性序列 种子决定了该序列的初始状态 在 Python 中NumPy 库 您可以使用设置随机种子numpy random seed 功能 这将使随机数生成的输出
  • Python map() 函数(转换可迭代对象)

    The map Python 中的 function 是一个内置函数 用于将函数应用于可迭代对象 数组 列表 元组 字典 集合 中的每个项目并返回一个迭代器 这使得它对于转换可迭代数据非常有用 目录 hide 1 Python map 函数
  • 使用 matplotlib 在 Python 中进行 3D 绘图

    数据可视化就是这样一个领域 大量的库都是用 Python 开发的 在这些当中 Matplotlib是数据可视化最流行的选择 虽然最初是为了绘制二维图表而开发的 例如直方图 条形图 散点图 线图等 Matplotlib 还扩展了其功能以提供
  • Bash 脚本编写第 6 部分 – 创建和使用 Bash 函数

    在讨论 bash 函数之前 我们先讨论一下这种情况 编写 bash 脚本时 您会发现自己在多个地方使用相同的代码 如果您厌倦了在 bash 脚本中一次又一次地编写相同的代码行 那么最好编写一次代码块并在 bash 脚本中的任何位置调用它 b