系统管理员,那些最密切地运行和管理 Linux 计算机的人员,可以直接访问可以帮助我们更有效地工作的工具。为了帮助您充分利用这些工具,使您的生活更轻松,本系列文章将探讨以 Bash shell 脚本形式进行的自动化。 它涵盖了
- 使用 Bash shell 脚本进行自动化的优势
- 为什么对于系统管理员来说,使用 shell 脚本比使用 C 或 C++ 等编译语言更好
- 为新脚本创建一组需求
- 从命令行界面 (CLI) 程序创建简单的 Bash shell 脚本
- 通过使用运行脚本的用户 ID (UID) 来增强安全性
- 使用逻辑比较工具为命令行程序和脚本提供执行流程控制
- 使用命令行选项来控制脚本功能
- 创建可以从脚本内的一个或多个位置调用的 Bash 函数
- 为什么以及如何将您的代码许可为开源
- 创建和实施简单的测试计划
我之前写过一系列关于 Bash 命令和语法以及在命令行创建 Bash 程序的文章,您可以在本文末尾的参考部分找到它们。但是这四篇文章的系列更多的是关于创建脚本(以及我认为有用的一些技术),而不是关于 Bash 命令和语法。
为什么我使用 shell 脚本
在 系统管理员的 Linux 哲学 的第 9 章中,我写道
“系统管理员在思考时效率最高——思考如何解决现有问题以及如何避免未来问题;思考如何监控 Linux 计算机,以便找到可以预测和预示未来问题的线索;思考如何让 [他们] 的工作更有效率;思考如何自动化所有需要每天或每年执行一次的任务。
“系统管理员在创建 shell 程序时,效率仅次于思考,这些程序可以自动化他们在看似无效率时构思出的解决方案。我们拥有的自动化越多,我们就越有时间来解决实际问题,并思考如何自动化比我们已经拥有的更多的事情。”
第一篇文章探讨了为什么 shell 脚本是系统管理员的重要工具,以及创建非常简单的 Bash 脚本的基础知识。
为什么要自动化?
您是否曾经在命令行执行过漫长而复杂的任务,然后想,“很高兴完成了。现在我再也不用担心它了!”?我经常这样想。我最终发现,我需要在计算机上执行的几乎所有事情(无论是我的还是属于雇主或咨询客户的计算机)将来都需要再次完成。
当然,我总是认为我会记住我是如何完成这项任务的。但是,通常,下一次是在遥远的未来,以至于我忘记了我曾经做过这件事,更不用说如何做了。我开始在纸上写下一些任务所需的步骤,然后心想:“我真是太蠢了!” 所以我把那些涂鸦转移到我电脑上的一个简单的记事本应用程序中,直到有一天,我再次想到,“我真是太蠢了!” 如果我要将这些数据存储在我的计算机上,我最好创建一个 shell 脚本并将其存储在一个标准位置,例如 /usr/local/bin 或 ~/bin,这样我就可以只需键入 shell 程序的名称,让它完成我过去手动完成的所有任务。
对我来说,自动化还意味着我不必记住或重新创建我执行任务的细节才能再次执行它。记住如何做事需要时间,键入所有命令需要时间。对于需要键入大量长命令的任务来说,这可能成为一个重要的时间消耗。通过创建 shell 脚本来自动化任务可以减少执行例行任务所需的输入。
Shell 脚本
编写 shell 程序(也称为脚本)是利用我时间的最佳策略。一旦我编写了一个 shell 程序,我可以根据需要多次重新运行它。我还可以更新我的 shell 脚本,以补偿从一个 Linux 版本到下一个版本的更改,安装新的硬件和软件,更改我想或需要通过脚本完成的事情,添加新功能,删除不再需要的功能,并修复我的脚本中不太常见的错误。这些类型的更改只是任何类型代码的维护周期的一部分。
可以通过在终端会话中通过键盘输入和执行 shell 命令来执行的每个任务都应该并且可以自动化。 系统管理员应该自动化我们被要求做或决定需要做的所有事情。 很多时候,提前进行自动化可以节省我的时间。
一个 Bash 脚本可以包含从几个命令到数千个命令的任何地方。 我编写过只有一两个命令的 Bash 脚本,并且我编写了一个超过 2,700 行的脚本,其中一半以上是注释。
开始
这是一个 shell 脚本及其创建方式的简单示例。在我之前的 Bash 命令行编程系列中,我使用了我读过的每本编程书籍中的示例:“Hello world。” 从命令行来看,它看起来像这样
[student@testvm1 ~]$ echo "Hello world"
Hello world
根据定义,程序或 shell 脚本是计算机要执行的一系列指令。但是每次都将它们输入到命令行中非常繁琐,尤其是当程序很长且复杂时。将它们存储在可以用单个命令执行的文件中可以节省时间并减少错误发生的可能性。
我建议在测试系统或虚拟机 (VM) 上以非 root 用户身份尝试以下示例。 虽然这些示例是无害的,但确实会发生错误,并且保持安全始终是明智的。
第一个任务是创建一个文件来包含您的程序。使用 touch 命令创建空文件 hello,然后使其可执行
[student@testvm1 ~]$ touch hello
[student@testvm1 ~]$ chmod 774 hello
现在,使用您喜欢的编辑器将以下行添加到文件中
echo "Hello world"
保存文件并从命令行运行它。您可以使用单独的 shell 会话来执行此系列中的脚本
[student@testvm1 ~]$ ./hello
Hello world!
这是您可能创建的最简单的 Bash 程序——文件中的单个语句。对于此练习,您完整的 shell 脚本将围绕这个简单的 Bash 语句构建。该程序的功能与此目的无关,这个简单的语句允许您构建程序结构(其他程序的模板),而无需担心功能目的的逻辑。您可以专注于基本程序结构并以非常简单的方式创建模板,并且您可以创建和测试模板本身,而不是复杂的函数程序。
Shebang
只要您使用 Bash 或与脚本中使用的命令兼容的 shell,单个语句就可以正常工作。如果脚本中未指定 shell,则将使用默认 shell 来执行脚本命令。
下一个任务是确保即使另一个 shell 是默认 shell,该脚本也将使用 Bash shell 运行。这是通过 shebang 行完成的。 Shebang 是描述 #! 字符的 geeky 方式,这些字符显式指定在运行脚本时要使用的 shell。在这种情况下,它是 Bash,但它可以是任何其他 shell。如果未安装指定的 shell,则脚本将不会运行。
将 shebang 行添加为脚本的第一行,所以现在看起来像这样
#!/usr/bin/bash
echo "Hello world!"
再次运行脚本——您应该看不到结果有任何差异。如果您安装了其他 shell(例如 ksh、csh、tcsh、zsh 等),请启动一个并再次运行该脚本。
脚本 vs. 编译程序
在编写程序来自动化所有内容时,系统管理员应该始终使用 shell 脚本。由于 shell 脚本以 ASCII 文本格式存储,因此人类可以像计算机一样轻松地查看和修改它们。您可以检查一个 shell 程序,看看它到底做了什么,以及语法或逻辑中是否有明显的错误。这是开放的强大例子。
我知道有些开发人员认为 shell 脚本不如“真正”的编程。对 shell 脚本和编写 shell 脚本的人的这种边缘化似乎基于这样一种观点,即唯一“真正”的编程语言是必须从源代码编译以生成可执行代码的语言。我可以根据经验告诉你,这绝对不是真的。
我使用过许多语言,包括 BASIC、C、C++、Pascal、Perl、Tcl/Expect、REXX(及其一些变体,包括 Object REXX)、许多 shell 语言(包括 Korn、csh 和 Bash),甚至还有一些汇编语言。曾经设计过的每种计算机语言都有一个目的:允许人类告诉计算机做什么。当您编写程序时,无论您选择哪种语言,您都在向计算机发出指令,以按特定顺序执行特定任务。
编写和测试脚本比编译语言快得多。通常必须快速编写程序,以满足情况或尖头老板施加的时间限制。系统管理员编写的大多数脚本都是为了解决问题、清理问题后的残局,或者为了交付一个必须在编译程序编写和测试之前很长时间才能运行的程序。
快速编写程序需要 shell 编程,因为它能够快速响应客户的需求——无论是您还是其他人。如果代码中的逻辑或错误存在问题,可以立即更正和重新测试。如果原始的需求集存在缺陷或不完整,则可以非常快速地更改 shell 脚本以满足新需求。一般来说,系统管理员工作中对开发速度的需求超过了使程序尽可能快地运行或尽可能少地使用系统资源(如 RAM)的需求。
系统管理员所做的大多数事情都需要比执行更长的时间来弄清楚如何做。因此,为所做的每件事创建 shell 脚本似乎适得其反。编写脚本并将其制作成产生可重现结果并可以根据需要多次使用的工具需要一些时间。每次您可以运行脚本而无需(再次)弄清楚如何执行任务时,都可以节省时间。
最后的想法
本文在创建 Shell 脚本方面没有取得太大进展,但确实创建了一个非常小的脚本。 它还探讨了创建 Shell 脚本的原因以及为什么它们是系统管理员最有效的选择(而不是编译后的程序)。
在下一篇文章中,您将开始创建一个 Bash 脚本模板,该模板可以用作其他 Bash 脚本的起点。 该模板最终将包含一个帮助工具、一个 GNU 许可声明、许多简单的函数以及一些处理这些选项的逻辑,以及基于此模板的脚本可能需要的其他选项。
资源
这个系列文章部分基于 David Both 的三部分 Linux 自学课程《使用和管理 Linux——从零到系统管理员》的第二卷第10章。
评论已关闭。