sh脚本和bash脚本
Sysadmins是我们中最紧密地运行和管理Linux计算机的管理员,可以直接访问有助于我们更有效地工作的工具。 为了帮助您最大程度地使用这些工具以使您的生活更轻松,本系列文章探讨了以Bash shell脚本的形式使用自动化。 它涵盖:
- 使用Bash Shell脚本实现自动化的优势
- 为什么使用Shell脚本对系统管理员来说比C或C ++等编译语言更好
- 为新脚本创建一组要求
- 从命令行界面(CLI)程序创建简单的Bash Shell脚本
- 通过使用运行脚本的用户ID(UID)增强安全性
- 使用逻辑比较工具为命令行程序和脚本提供执行流控制
- 使用命令行选项控制脚本功能
- 创建可以从脚本中的一个或多个位置调用的Bash函数
- 为什么以及如何将您的代码许可为开源
- 创建和实施简单的测试计划
我以前写过一系列有关Bash命令和语法以及在命令行上创建Bash程序的文章,您可以在本文结尾的参考部分中找到它们。 但是,本系列的四篇文章既涉及创建脚本(以及一些我认为有用的技术),也涉及Bash命令和语法。
为什么我使用shell脚本
在Sysadmin的Linux哲学第9章中,我写道:
“系统管理员在思考时效率最高—思考如何解决现有问题以及如何避免将来的问题;思考如何监视Linux计算机,以找到可以预见并预示未来问题的线索;思考如何做出[他们的工作效率更高;考虑如何使每天或每年一次需要执行的所有任务自动化。
“系统管理员在创建外壳程序时效率最高,而这些程序可以使他们构思的解决方案自动化,而这些解决方案似乎效率不高。我们拥有的自动化程度越高,我们就可以在解决实际问题时有更多的时间来解决并思考如何解决这些问题。自动化甚至超过我们已经拥有的。”
第一篇文章探讨了Shell脚本为何是sysadmin的重要工具,以及创建非常简单的Bash脚本的基础。
为什么要自动化?
您是否曾经在命令行上执行过一项漫长而复杂的任务,并想过:“很高兴完成了。现在我不必再为它担心了!”? 我经常有。 我最终发现,几乎将来我需要在计算机上进行的几乎所有操作(无论是我的还是属于雇主或咨询客户的计算机)都需要再次进行。
曾经做过,更不用说怎么做了。 我开始在纸上写下一些任务所需的步骤,然后想到:“我多么愚蠢!” 因此,我将这些涂鸦转移到计算机上的一个简单记事本应用程序中,直到有一天,我再次想到:“我有多愚蠢!” 如果要将这些数据存储在计算机上,则最好创建一个Shell脚本并将其存储在标准位置,例如/ usr / local / bin或〜/ bin ,因此我只需键入外壳名称即可程序,让它完成我以前手动完成的所有任务。对我来说,自动化也意味着我不必记住或重新创建执行任务的细节即可再次执行。 记住如何操作和键入所有命令需要花费时间。 对于需要键入大量长命令的任务来说,这可能会成为很大的时间浪费。 通过创建shell脚本来自动化任务,减少了执行例行任务所需的键入。
Shell脚本
编写Shell程序(也称为脚本)是利用我的时间的最佳策略。 一旦编写了外壳程序,就可以根据需要重新运行它多次。 我还可以更新自己的Shell脚本,以补偿从一个Linux版本到另一个Linux版本的更改,安装新的硬件和软件,更改我希望或需要使用该脚本完成的功能,添加新功能,删除不再需要的功能,并修复脚本中不太常见的错误。 对于任何类型的代码,此类更改只是维护周期的一部分。
在终端会话中通过键盘输入和执行shell命令执行的每项任务都可以并且应该自动化。 系统管理员应使我们被要求做的所有事情自动化或决定需要做的事情。 很多时候,预先进行自动化可以节省我的时间。
一个Bash脚本可以包含从几个命令到数千个命令的任意位置。 我只用一个或两个命令编写了Bash脚本,并且编写了一个包含2700行以上的脚本,其中一半以上是注释。
入门
这是一个简单的shell脚本示例以及如何创建它。 在我的早期Bash命令行编程系列中,我使用了我读过的每本编程书籍中的示例:“ Hello world”。 在命令行中,它看起来像这样:
[ student
@ testvm1 ~
] $
echo
"Hello world"
Hello world
根据定义,程序或外壳程序脚本是计算机执行的一系列指令。 但是每次都在命令行中输入它们非常繁琐,尤其是在程序又长又复杂的情况下。 将它们存储在可以使用单个命令执行的文件中,可以节省时间并减少错误蔓延的可能性。
我建议以非root用户身份在测试系统或虚拟机(VM)上尝试以下示例。 尽管这些示例是无害的,但错误的确会发生,并且安全始终是明智的。
第一个任务是创建一个文件来包含您的程序。 使用touch命令创建一个空文件hello ,然后使其可执行:
[ student
@ testvm1 ~
] $
touch hello
[ student
@ testvm1 ~
] $
chmod
774 hello
现在,使用您喜欢的编辑器将以下行添加到文件中:
echo "Hello world"
保存文件并从命令行运行它。 您可以使用单独的shell会话来执行本系列中的脚本:
[ student
@ testvm1 ~
] $ .
/ hello
Hello world
!
这是您可能创建的最简单的Bash程序-文件中的单个语句。 对于本练习,将围绕此简单的Bash语句构建完整的shell脚本。 程序的功能与此目的无关,并且此简单的语句使您可以构建程序结构(其他程序的模板),而不必考虑功能目的的逻辑。 您可以专注于基本程序结构并以非常简单的方式创建模板,并且可以创建和测试模板本身,而不是复杂的功能程序。
舍邦
只要您使用Bash或与脚本中使用的命令兼容的shell,单个语句就可以正常工作。 如果脚本中未指定任何外壳程序,则将使用默认外壳程序执行脚本命令。
下一个任务是确保脚本将使用Bash Shell运行,即使默认使用另一个Shell。 这是通过射棒线完成的。 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脚本以满足新需求。 通常,在sysadmin作业中对开发速度的需求超过了使程序尽可能快地运行或以诸如RAM之类的系统资源的方式使用尽可能少的需求。
系统管理员要做的大多数事情要花很多时间才能执行。 因此,为您执行的所有操作创建shell脚本似乎会适得其反。 编写脚本并使其成为可产生可复制结果的工具需要花费一些时间,并且可以根据需要多次使用。 每次您可以运行脚本而无需弄清楚(再次)如何执行任务时,就会节省时间。
最后的想法
本文与创建shell脚本并没有走太远,但确实创建了一个很小的脚本。 它还探讨了创建Shell脚本的原因,以及为什么它们是系统管理员(而不是已编译程序)最有效的选择。
在下一篇文章中,您将开始创建一个Bash脚本模板,该模板可用作其他Bash脚本的起点。 该模板最终将包含一个帮助工具,一个GNU许可声明,一些简单的功能以及一些处理这些选项的逻辑,以及基于该模板的脚本可能需要的其他逻辑。
资源资源
本系列文章部分基于David Both的Linux自学课程(共三部分)的第2卷第10章,该课程使用和管理Linux —从零到SysAdmin 。
翻译自: https://opensource.com/article/19/12/automation-bash-scripts
sh脚本和bash脚本