50% 折扣 所有计划,时间有限。开始于 $2.48/mo
还剩 11 分钟
服务器和操作系统

Bash 函数解释:语法、示例和用例

凯莉·沃森 By 凯莉·沃森 阅读时间 11 分钟 更新于 2025 年 12 月 14 日
发光蓝色代码块的抽象 3D 插图组装成模块化结构,代表 Bash 函数

Bash 函数将相关命令分组到一个名称下。当您调用该名称时,整个块都会执行。您可以传递参数来自定义行为并返回值来传达结果。这可以使您的代码保持干净且易于维护。

Linux 在全球服务器环境中占据主导地位,因此掌握 Bash 功能现在比以往任何时候都更加重要。函数将杂乱的脚本变成干净、可重用的自动化。

本指南将引导您了解基本语法和高级用例。您将学习如何声明函数、传递参数、处理返回值,并查看可在自己的脚本中使用的十个实际示例。

长话短说

  • Bash 函数是命名的代码块,您可以在整个脚本中重复使用
  • 使用定义函数 函数名() { 命令; } 句法
  • 使用传递参数 $1, $2, $3 位置参数
  • 函数提高代码可读性、模块化和可维护性
  • 使用 返回 退出函数并传达状态代码(0 = 成功,非零 = 失败)
  • 可以使用以下命令在脚本之间共享函数 来源 or 导出-f
  • 实际示例包括文件备份、磁盘监控、输入验证和服务检查

什么是 Bash 脚本?

数字卷轴的 3D 插图,带有发光的 Bash 代码自行编写,代表 Bash 脚本的自动化。

Bash 脚本编写是一种使用 Bash shell 实现任务自动化的方法。它是 Linux 的默认命令行界面,并且仍然是 macOS 上的标准工具。 Bash 脚本是用 Bash 脚本语言编写的程序,可以在终端中执行或作为独立的脚本文件执行。

Linux 桌面使用率稳步增长 随着操作系统在全球服务器环境中占据主导地位,Bash 脚本编写技能对于 IT 专业人员来说变得非常有价值。该语言与 Docker、Kubernetes 和 CI/CD 管道等 DevOps 工具完美集成。

Bash 脚本允许您完成从简单命令到复杂自动化和系统管理的任务。您可以自动执行重复性任务、开发维护脚本、构建部署管道、管理软件系统和操作数据。

什么是 Bash 函数?

未来派数字插图显示杂乱的命令行数据由发光的处理门组织,象征着 Bash 函数的工作原理,左侧有空白区域。

Bash 函数可以定义为一组命令,这些命令可以在 Bash 脚本中定义,也可以在命令提示符处交互设置,具体取决于用例。定义后,Bash 函数可以在脚本或其他脚本中多次调用,就像常规 shell 命令一样。

Bash 函数允许您创建可重用的代码块,这些代码块可以执行复杂的操作、组织代码并简化脚本。您可以将参数传递给 Bash 函数,然后在函数中使用它们来执行操作。 Bash 函数返回的值可以在脚本的其他地方使用。

e 将涵盖几种具体的实现方式,包括 简单函数 对于基本逻辑, 简单输入 用于参数处理和高级结构,例如 斐波那契递归.

Bash 函数基础知识 对于任何从事自动化工作的系统管理员或 DevOps 工程师来说都很重要。以下部分详细介绍了每种类型。

为什么使用 Bash 函数?

带有优化符号的发光蓝色齿轮驱动编码机,代表使用 Bash 函数获得的效率和速度。

现在已经介绍了 Bash 函数的定义,让我们回顾一下它们的主要优点。本节帮助您了解函数在哪里最有用。

可重复使用性

您创建了一个 Bash 函数,您就拥有了一个强大的工具。您可以编写一次代码块,然后在您的脚本甚至其他脚本中多次重复使用它。

这使您的代码更加高效,并通过消除重复来节省时间。维护代码变得更加简单,因为您只需在一处更改函数。

可读性

复杂的脚本可能难以破译。 Bash 函数通过将脚本分解为更小、更易于管理的部分来解决这个问题。

每个函数都有一个特定的用途,并有一个描述性名称来解释其作用。这可以帮助您和其他人更轻松地理解和维护代码。

模块化

函数组织您的代码。您可以将逻辑拆分为更小的模块,这使您的脚本结构保持干净且易于管理。

如果您需要添加新功能,您可以在不干扰脚本其他部分的情况下完成。当需要删除或修改功能时,脚本的其余部分保持不变。

Bash 函数参数

您可以将参数传递给您的函数。这些参数允许您的函数根据收到的输入进行调整并执行不同的操作。

这开辟了许多可能性,同时使您的功能更加通用和适应性更强。您不必多次编写类似的代码,而是编写一个处理不同输入的函数。

如何以及在何处使用 Bash 函数?

3D 玻璃流程图显示脚本执行分支到功能块并返回,可视化 Bash 函数在逻辑流中的使用方式。

现在,让我们了解一下我们的定义,并从一个如何创建 Bash 函数的简短示例开始。以下语法可在基于 Unix 的环境中使用。如果您在 Windows 上工作,您可以 在 Windows 10 上安装 Linux Bash 跟随这些例子。

创建 Bash 函数

首先使用以下命令结构:

函数名 () {

    # 命令放在这里

}

 

创建函数后,您可以随时在代码中使用它。这是一个工作示例:

问候 () {

    echo “你好,1 美元!”

}

 

调用此函数 迎接世界 输出“你好,世界!”这 $1 表示传递给函数的第一个参数。

以下是您可以在自己的脚本中使用的一些更实际的示例:

# 创建任何文件的备份

备份文件(){

    cp“$1”“$1.bak”

    echo“已创建备份:$1.bak”

}

 

# 检查目录是否存在,不存在则创建

确保_dir () {

    如果 [ ! -d“$1”];然后

        mkdir -p“$1”

        echo“创建目录:$1”

    fi

}

 

# 记录带有时间戳的消息

日志消息(){

    echo “[$(日期‘+%Y-%m-%d %H:%M:%S’)] $1”

}

 

您只需定义一次这些自定义 Bash 函数,即可在整个脚本中根据需要随时调用它们。

函数语法要点

函数的行为类似于主脚本中的迷你脚本,但它们共享 shell 的内存。编写它们时请记住这三种特定行为。

变量范围(本地与全局)

函数内的变量默认是全局的。如果你定义 my_var=”测试” 在函数内部,它会覆盖任何现有的 我的_var 在你的脚本中。总是使用 当地的 将变量限制在函数中可以防止副作用:

本地 my_var=”值”

位置参数

函数使用相同的方法读取参数 $1, $2, 和 $@ 变量作为脚本。这些是函数本地的,并在函数退出时重置。除非显式传递脚本的原始参数,否则无法在函数内部访问它们。

返回值

Bash 函数不像 Python 或 JavaScript 函数那样返回数据。这 返回 命令仅设置退出状态(0-255)来指示成功或失败。要返回实际数据(如字符串或计算), 回声 结果并在调用函数时捕获它:

结果=$(我的函数)

十大有用的 Bash 函数示例

现在您已经了解了 Bash 函数以及如何创建它们,下面有十个可以添加到脚本中的实际示例。每个函数都解决一个常见问题,并演示正确的结构、参数和返回值。

1. 文件备份功能

创建任何文件的带时间戳的备份:

备份文件(){

    本地文件=”$1″

    本地备份=”${文件}.$(日期+%Y%m%d_%H%M%S).bak”

    

    如果[-f“$file”];然后

        cp“$文件”“$备份”

        echo“已创建备份:$backup”

        返回0

    别的

        echo“错误:找不到文件”

        返回1

    fi

}

 

用法: 备份文件 /etc/nginx/nginx.conf

2.目录检查器

检查目录是否存在并根据需要创建它:

确保_dir () {

    本地目录=”$1″

    

    如果 [ ! -d“$dir”];然后

        mkdir -p “$dir”

        echo“已创建:$dir”

    fi

}

 

用法: 确保_dir /var/log/myapp

3. 时间戳记录器

向日志消息添加时间戳以进行调试:

日志消息(){

    本地级别=”$1″

    本地消息=”$2″

    echo “[$(日期‘+%Y-%m-%d %H:%M:%S’)] [$level] $message”

}

 

用法: log_message“信息”“脚本已启动”

4. 磁盘空间监控

检查磁盘使用情况并在超过阈值时发出警告:

检查磁盘空间(){

    本地阈值=”${1:-80}”

    本地用法=$(df / | tail -1 | awk ‘{print $5}’ | tr -d ‘%’)

    

    if [“$usage”-gt“$threshold”];然后

        echo“警告:磁盘使用率为${usage}%”

        返回1

    fi

    返回0

}

 

用法: 检查磁盘空间 90

5. 输入验证器

验证用户输入不为空:

验证输入(){

    本地输入=”$1″

    本地名称=”$2″

    

    如果[-z“$input”];然后

        echo“错误:$name不能为空”

        返回1

    fi

    返回0

}

 

用法: validate_input“$用户名”“用户名”

6. 服务状态检查器

检查服务是否正在运行并报告状态:

检查服务(){

    本地服务=”$1″

    

    如果 systemctl 处于活动状态 –quiet “$service”;然后

        echo“$服务正在运行”

        返回0

    别的

        echo“$服务没有运行”

        返回1

    fi

}

 

用法: 检查服务 nginx

7. 文件扩展名提取器

从文件名中提取扩展名:

获取扩展名(){

    本地文件名=”$1″

    回显“${文件名##*.}”

}

 

用法: ext=$(get_extension“文档.pdf”)

8. 剪线器

从字符串中删除前导和尾随空格:

修剪字符串(){

    本地str=”$1″

    str=”${str#”${str%%[![:space:]]*}”}”

    str=”${str%”${str##*[![:space:]]}”}”

    回显“$str”

}

 

用法: 干净=$(trim_string“你好世界”)

9. 安全文件存档器

将文件移动到自定义 $HOME/.trash 目录,而不是永久删除它。它将时间戳附加到文件名以防止覆盖以前的备份。

安全删除(){

    本地文件=”$1″

    本地垃圾=”$HOME/.trash”

    # 附加时间戳以避免覆盖现有文件

    本地 new_name=”$(基本名称“$file”)_$(日期 +%s)”

    

    mkdir -p“$垃圾”

 

    如果[-e“$file”];然后

        mv“$file”“$trash/$new_name”

        echo“已移至存档:$file -> $trash/$new_name”

    别的

        echo“错误:$文件未找到”

        返回1

    fi

}

 

用法: 安全删除old_script.sh

 

10. 状态报告者

演示用于错误处理的 Bash 函数返回机制。 Bash 函数返回值表示成功(0)或失败(非零):

进程数据(){

    本地文件=”$1″

    

    如果 [ ! -f“$文件”];然后

        返回1

    fi

    

    # 处理文件

    猫“$文件”|厕所-l

    返回0

}

 

# 检查返回值

process_data“数据.txt”

如果 [ $? -eq 0];然后

    echo “处理完成”

别的

    echo “处理失败”

fi

 

$? 变量捕获最后一个命令或函数调用的退出状态。

功能 目的 主要特点
备份文件 创建文件备份 带时间戳的命名
确保目录 目录管理 如果缺失则创建
日志消息 记录 时间戳前缀
检查磁盘空间 系统监控 阈值警报
验证输入 输入验证 空字符串检查
检查服务 服务监控 系统集成
获取扩展名 字符串解析 参数扩展
修剪字符串 字符串清理 空白删除
安全删除 安全删除 垃圾目录
进程数据 错误处理 返回值

在 VPS 上运行 Bash 函数

当在专用服务器环境上运行时,Bash 功能会变得强大。我们的 Linux虚拟专用服务器 为您提供完全的 root 访问权限来自定义您的 shell 环境、创建系统范围的函数库以及不受限制地自动执行服务器管理任务。

使用 VPS,您可以将可重用的功能存储在 /etc/profile.d/ 对于所有用户,通过 cron 作业安排基于函数的脚本,并构建用于部署和维护的自动化管道。我们在全球 12 个地点提供具有高达 40 Gbps 网络速度和 DDR5 内存的服务器,这意味着更快的脚本执行和更流畅的数据处理。

这种级别的控制使 VPS 成为任何认真关注 shell 脚本和系统自动化的人的理想选择。

结论

Bash 函数是创建模块化和可重用脚本的关键。它们允许您将相关命令组合在一起并封装复杂的逻辑,以使您的代码更易于阅读和维护。如果您正在管理云基础设施、自动化部署管道或处理日常系统管理任务,函数可以帮助您的脚本保持井然有序且高效。

在本文中,我们介绍了 Bash 函数的基础知识,包括如何定义和调用它们、十个实用函数示例以及常见用例,以帮助您开始自己的自动化项目。

结合像这样的控制结构 Bash if 语句、函数为您提供强大自动化的构建块。通过在脚本中使用 Bash 函数,您可以编写更清晰、更模块化、更易于理解和维护的代码。

常问问题

Bash 函数可以有局部变量吗?

是的。 Bash 函数可以使用 local 关键字来拥有局部变量。这将变量的作用域限制在函数内,防止它影响函数外同名的变量。

Bash 函数可以递归吗?

是的,Bash 函数可以是递归的。 Bash 的默认调用堆栈大小相对较小,因此根据您想要的递归函数,您可能需要在执行之前使用 ulimit -s 命令增加它。

我可以在其他脚本中使用 Bash 函数吗?

是的,您可以使用 source 命令(或其简写 .)在脚本之间共享 Bash 函数。通过获取包含函数定义的文件,您可以使这些函数在调用脚本中可用。对于子进程,使用export -f function_name 使该函数可访问。

我可以在管道中使用 Bash 函数吗?

是的,但它需要外部命令的特定步骤。在脚本内,您可以将数据直接通过管道传输到函数(例如,cat file | my_function)。但是,xargs 或 find -exec 等命令在新环境中运行。要在那里使用函数,必须将其导出 (export -f my_func),然后显式调用 Bash(例如 xargs bash -c ‘my_func “$@”’)。

什么是 shell 脚本函数?

shell 脚本函数是 shell 脚本中定义的代码块,用于特定目的并且可以从脚本的各个部分调用。函数在代码模块化、更好的可重用性和更容易维护方面提供了巨大的价值。在 Bash 脚本环境中,函数被封装在整个脚本中。

分享

更多来自博客

继续阅读。

可以使用 Cosmos Cloud 运行的最佳自托管应用程序封面图像,其中包含 Cosmos 仪表板周围的应用程序面板。
服务器和操作系统

可以使用 Cosmos Cloud 运行的最佳自托管应用程序:文件、媒体、密码、自动化等等!

也许您已经设置了 Cosmos Cloud,现在想看看哪些应用程序与其匹配,或者您甚至还没有决定使用 Cosmos,只是想看看它有多适合您的工作

尼克·西尔弗尼克·西尔弗 阅读时间 16 分钟
Portainer 与 Cosmos Cloud 用于管理 Docker 应用程序的比较,包括混合设置图和 neon ops 与访问块。
服务器和操作系统

Portainer 与 Cosmos Cloud:最适合 Docker 应用程序管理

如果您已经了解 Docker 并且只是想要以更简洁的方式运行不断增长的应用程序堆栈,那么这里是 Portainer 与 Cosmos Cloud 的简短回答。 Portainer 是直接的更强选择

尼克·西尔弗尼克·西尔弗 阅读时间 14 分钟
Cosmos Cloud、CasaOS 与 Umbrel 专题图显示了一个抽象云网络世界中的三个自托管路径。
服务器和操作系统

Cosmos Cloud、CasaOS 与 Umbrel:哪个自托管平台适合您的设置?

简而言之,CasaOS 仍然是最容易开始的地方,Umbrel 具有最干净的策划感觉,一旦您想要更严格地控​​制 doma,Cosmos Cloud 就更有意义

尼克·西尔弗尼克·西尔弗 阅读时间 11 分钟

准备好部署了吗? 每月 2.48 美元起。

独立云,自 2008 年起。AMD EPYC、NVMe、40 Gbps。 14 天退款。