gray and blue concrete tunnel at daytime

一劳永逸:Bash 脚本的威力

面临重复性任务的系统管理员应该使用 Bash 脚本来掌控局面。本指南深入探讨了基础知识,…
首页 » 博客 » 一劳永逸:Bash 脚本的威力

Bash 脚本为重复性任务提供了实用的解决方案。

在本系列的第四部分中,您将学习如何创建一个简单的 shell 脚本,以及为什么这项强大的技能可以让您自动化常见的系统管理任务,从而解放您的时间,投入到更具战略意义的工作中。本指南为 Bash 脚本编写提供了坚实的基础,帮助您简化工作流程,提高效率。

作者注:本文是最初发布在 Opensource.com 上的系列文章的一部分,结合并更新了之前的内容,以提供更新的学习体验。

简介

Linux 系统管理员拥有强大的工具来简化任务。本系列探讨了利用 Bash shell 脚本进行自动化,这是一项宝贵的技能,可以为您节省时间和精力。
我们将深入探讨

  • 使用 Bash shell 脚本进行自动化的优势
  • 为什么对于系统管理员来说,使用 shell 脚本比使用 C 或 C++ 等编译型语言更好
  • 为新脚本创建一组需求
  • 从命令行界面 (CLI) 程序创建简单的 Bash shell 脚本
  • 通过使用运行脚本的用户 ID (UID) 来增强安全性
  • 使用逻辑比较工具为命令行程序和脚本提供执行流程控制
  • 使用命令行选项来控制脚本功能
  • 创建可以从脚本内一个或多个位置调用的 Bash 函数
  • 为什么以及如何以开源方式许可您的代码
  • 创建和实施简单的测试计划

本文探讨了 shell 脚本为什么是关键工具,以及创建非常简单的 Bash 脚本的基础知识。

为什么我要自动化一切

在《系统管理员的 Linux 哲学》第九章中,我写道

“当系统管理员在思考时,效率最高——思考如何解决现有问题以及如何避免未来问题;思考如何监控 Linux 计算机以找到预见和预示未来问题的线索;思考如何使 [他们的] 工作更有效率;思考如何自动化所有那些需要每天或每年执行一次的任务。

“当系统管理员创建 shell 程序来自动化他们在看似效率低下时构思的解决方案时,他们的效率仅次于思考。我们拥有的自动化越多,我们就越有时间在真正的问题发生时修复它们,并思考如何自动化比我们已经拥有的更多。”

在完成漫长而复杂的命令行任务后,我们都松了一口气。但是,如果您永远不必担心重复它呢?Bash 脚本自动化了这些任务,为您节省时间和挫败感。

我们都依赖记忆力,但它并不完美。Bash 脚本消除了记住复杂任务的困难——您只需编写一次并将其自动化以供将来使用,方法是将其存储在标准位置,例如 /usr/local/bin~/bin,然后我只需键入 shell 程序的名称,就可以让它处理我过去手动完成的所有任务。

除了方便之外,自动化还为您节省宝贵的时间。回忆复杂的命令并重新键入它们是一个时间黑洞。Bash 脚本通过自动化重复性任务来消除这一点,让您可以专注于其他优先事项。

Shell 程序

编写 shell 程序(也称为脚本)是利用我的时间的最佳策略。一旦我编写了一个 shell 程序,我可以根据需要多次重新运行它。我还可以更新我的 shell 脚本,以补偿 Linux 从一个版本到下一个版本的更改,安装新的硬件和软件,更改我想用脚本完成的事情或需要完成的事情,添加新功能,删除不再需要的功能,并修复我的脚本中并不罕见的错误。这些类型的更改只是任何类型代码维护周期的一部分。

通过在终端会话中通过键盘输入和执行 shell 命令执行的每个任务都可以并且应该自动化。系统管理员应该自动化我们被要求做或决定需要做的所有事情。很多时候,预先进行自动化第一次就为我节省了时间。

一个 Bash 脚本可以包含从几个命令到数千个命令的任何内容。我编写过只有一两个命令的 Bash 脚本,也编写过一个超过 2,700 行的脚本,其中一半以上是注释。

开始入门

这是一个 shell 脚本的简单示例以及如何创建它。经典的编程从“Hello world”开始。这个简单的示例转换为命令行上的单个命令

$ echo "Hello world"
Hello world

根据定义,程序或 shell 脚本是计算机要执行的一系列指令。但是每次都将它们键入命令行既繁琐又乏味,尤其是在程序冗长而复杂时。将它们存储在可以使用单个命令执行的文件中可以节省时间并减少错误发生的可能性。

我建议在测试系统或虚拟机 (VM) 上以非 root 用户身份尝试以下示例。虽然这些示例是无害的,但错误确实会发生,并且安全始终是明智之举。

首要任务是创建一个文件来包含您的程序。使用 touch 命令创建空文件 hello,然后使其可执行

$ touch hello
$ chmod 774 hello

现在,使用您喜欢的编辑器将以下行添加到文件中

echo "Hello world"

保存文件并从命令行运行它。
您可以使用单独的 shell 会话来执行本系列中的脚本

[student@testvm1 ~]$ ./hello 
Hello world!

这是您可能创建过的最简单的 Bash 程序——文件中的单个语句。对于本练习,您的整个 shell 脚本将围绕这个简单的 Bash 语句构建。程序的函数对于此目的来说是无关紧要的,这个简单的语句允许您构建程序结构——其他程序的模板——而无需担心功能目的的逻辑。您可以专注于基本的程序结构,并以非常简单的方式创建模板,并且您可以创建和测试模板本身,而不是复杂的函数程序。

Shebang

只要您使用 Bash 或与脚本中使用的命令兼容的 shell,单个语句就可以正常工作。如果脚本中未指定 shell,则将使用默认 shell 执行脚本命令。

下一个任务是确保脚本将使用 Bash shell 运行,即使另一个 shell 是默认 shell。这可以通过 shebang 行完成。Shebang 是描述 #! 字符的极客方式,它显式指定运行脚本时要使用的 shell。在本例中,它是 Bash,但它可以是任何其他 shell。如果未安装指定的 shell,则脚本将不会运行。

将 shebang 行添加为脚本的第一行,现在它看起来像这样

#!/usr/bin/bash
echo "Hello world!"

再次运行脚本——您应该看不到结果有任何差异。如果您安装了其他 shell(例如 ksh、csh、tcsh、zsh 等),请启动一个并再次运行脚本。

脚本与编译程序

当编写程序来自动化(嗯,一切)时,系统管理员应始终使用 shell 脚本。由于 shell 脚本以 ASCII 文本格式存储,因此人类可以像计算机一样轻松地查看和修改它们。您可以检查 shell 程序,并准确地了解它的作用以及语法或逻辑中是否存在任何明显的错误。这是开放的强大例证。

一些开发人员认为 shell 脚本是“较低级”的编程,因为它被解释而不是编译。但是这种区分忽略了 shell 脚本在自动化任务方面的强大功能。这两种语言都实现了相同的目标:指示计算机执行特定操作。

我使用过许多语言,包括 BASIC、C、C++、Pascal、Perl、Tcl/Expect、REXX(及其一些变体,包括 Object REXX)、许多 shell 语言(包括 Korn、csh 和 Bash),甚至还有一些汇编语言。曾经设计过的每种计算机语言都有一个目的:允许人类告诉计算机要做什么。当您编写程序时,无论您选择哪种语言,您都在向计算机发出指令,以按特定顺序执行特定任务。

脚本的编写和测试速度远快于编译型语言。通常必须快速编写程序,以满足环境或尖头老板施加的时间限制。Shell 脚本是系统管理员用于快速修复的工具箱。它们可以解决问题、自动化清理任务,并比编译型语言更快地交付程序。这使得它们非常适合紧急情况或重复性操作。

快速编写程序需要 shell 编程,因为它能够快速响应客户的需求——无论是您自己还是其他人。如果逻辑存在问题或代码中存在错误,可以立即更正并重新测试。如果最初的需求集存在缺陷或不完整,则可以非常快速地更改 shell 脚本以满足新需求。总的来说,系统管理员工作中开发速度的需求超过了使程序运行速度尽可能快或尽可能少地使用系统资源(如 RAM)的需求。

系统管理员所做的大多数事情都需要比执行更长的时间来弄清楚如何做。因此,为所做的每件事创建 shell 脚本似乎适得其反。编写脚本并使其成为能够产生可重复结果并可以根据需要多次使用的工具需要一些时间。每次您可以运行脚本而无需(再次)弄清楚如何完成任务时,都会节省时间。

最终想法

本文在创建 shell 脚本方面没有取得很大进展,但它确实创建了一个非常小的脚本。它还探讨了创建 shell 脚本的原因,以及为什么它们是系统管理员而不是编译程序的最有效选择。

在下一篇文章中,您将开始创建一个 Bash 脚本模板,该模板可用作其他 Bash 脚本的起点。该模板最终将包含帮助工具、GNU 许可声明、几个简单的函数以及一些处理这些选项的逻辑,以及基于此模板的脚本可能需要的其他选项。

作者

1 条评论

如果您喜欢这篇文章,您可能还会喜欢这些