Bash 编程入门

学习如何在 Bash 中编写自定义程序,以自动化您的重复性任务。下载我们的新电子书开始学习。
85 位读者喜欢这篇文章。
Command line prompt

Opensource.com

Unix 最初的希望之一是,它能够让日常计算机用户微调他们的计算机,以匹配他们独特的工作方式。几十年来,人们对计算机定制的期望有所降低,许多用户认为他们收集的应用程序和网站就是他们的“自定义环境”。其中一个原因是,许多操作系统的组件不是开源的,因此普通用户无法获得它们的源代码。

但是对于 Linux 用户来说,自定义程序是触手可及的,因为整个系统都基于通过终端可用的命令。终端不仅仅是快速命令或深入故障排除的界面;它还是一个脚本环境,可以通过为您处理单调的任务来减少您的工作量。

如何学习编程

如果您以前从未进行过任何编程,那么将它看作是两个不同的挑战可能会有所帮助:一个是要理解代码是如何编写的,另一个是要理解要编写什么代码。您可以学习语法——但是如果不了解语言中可用的词汇,您将寸步难行。在实践中,您会同时开始学习这两个概念,因为您不能在没有词汇来排列的情况下学习语法,因此最初,您使用基本命令和基本编程结构编写简单的任务。一旦您对基础知识感到舒适,您就可以探索更多的语言,以便使您的程序能够做更多和更重要的事情。

Bash 中,您使用的大多数词汇都是 Linux 命令。语法是 Bash。如果您已经经常使用 Bash,那么过渡到 Bash 编程相对容易。但是如果您不使用 Bash,您会很高兴地了解到它是一种为清晰和简洁而构建的简单语言。

交互式设计

有时,学习编程时最难弄清楚的事情是计算机可以为您做什么。显然,如果计算机本身可以完成您用它所做的一切,那么您就不必再碰计算机了。但现实是,人类很重要。找到计算机可以帮助您的事情的关键是注意您在一周中重复执行的任务。计算机尤其擅长处理重复性工作。

但是,为了能够告诉您的计算机做某事,您必须知道如何去做。这是 Bash 擅长的领域:交互式编程。当您在终端中执行操作时,您也在学习如何编写脚本。

例如,我曾经的任务是将大量 PDF 书籍转换为低墨水和打印机友好的版本。一种方法是在 PDF 编辑器中打开 PDF,选择数百个图像中的每一个(页面背景和纹理也算作图像),删除它们,然后将其保存为新的 PDF。仅一本书就需要半天的时间。

我的第一个想法是学习如何编写 PDF 编辑器的脚本,但在研究了几天后,我找不到可以编写脚本的 PDF 编辑应用程序(除了非常丑陋的鼠标自动化黑客技术)。因此,我将注意力转向从终端内部完成任务。这导致了几个新的发现,包括 GhostScript,PostScript 的开源版本(PDF 基于的打印机语言)。通过使用 GhostScript 完成这项任务几天,我确认它是解决我的问题的方案。

制定一个运行该命令的基本脚本仅仅是将我用于从 PDF 中删除图像的命令和选项复制并粘贴到文本文件中。将该文件作为脚本运行,大概会产生相同的结果。

将参数传递给 Bash 脚本

在终端中运行命令和在 shell 脚本中运行命令之间的区别在于,前者是交互式的。在终端中,您可以根据需要进行调整。例如,如果我刚刚处理了 example_1.pdf 并且准备处理下一个文档,要调整我的命令,我只需要更改文件名即可。

但是,shell 脚本不是交互式的。事实上,shell脚本存在的唯一原因是为了让您不必去管它。这就是为什么命令(以及运行它们的 shell 脚本)接受参数。

在 shell 脚本中,有一些预定义的变量反映了脚本的启动方式。初始变量是 $0,它表示用于启动脚本的命令。下一个变量是 $1,它表示传递给 shell 脚本的第一个“参数”。例如,在命令 echo hello 中,命令 echo$0,,单词 hello$1。在命令 echo hello world 中,命令 echo$0hello$1world$2

在交互式 shell 中

$ echo hello world
hello world

在非交互式 shell 脚本中,您可以以非常字面的方式做同样的事情。将此文本键入文本文件并将其另存为 hello.sh

echo hello world

现在运行脚本

$ bash hello.sh
hello world

这可行,但它没有利用脚本可以接受输入的事实。将 hello.sh 更改为这样

echo $1

使用引号将两个参数组合在一起作为一个参数运行脚本

$ bash hello.sh "hello bash"
hello bash

对于我的 PDF 缩小项目,我非常需要这种非交互性,因为每个 PDF 都需要几分钟才能压缩。但是通过创建一个接受我输入的脚本,我可以一次性向脚本提供多个 PDF 文件。脚本按顺序处理每个文件,这可能需要半小时或更长时间,但这是我可以用来执行其他任务的半小时。

流程控制

创建 Bash 脚本完全可以接受,这些脚本本质上是您为完成需要重复的任务而采取的确切过程的记录。但是,通过控制信息如何在脚本中流动,可以使脚本更加强大。管理脚本对数据响应的常用方法是

  • if/then
  • for 循环
  • while 循环
  • case 语句

计算机不智能,但它们擅长比较和解析数据。如果您在脚本中构建一些数据分析,脚本会感觉更加智能。例如,基本的 hello.sh 脚本无论是否有内容要回显都会运行

$ bash hello.sh foo
foo
$ bash hello.sh

$

如果在没有收到任何输入时提供帮助消息,它会更加用户友好。这是一个 if/then 语句,如果您以基本方式使用 Bash,您可能不知道 Bash 中存在这样的语句。但是编程的一部分是学习语言,通过一点研究,您会了解 if/then 语句

if [ "$1" = "" ]; then
	echo "syntax: $0 WORD"
	echo "If you provide more than one word, enclose them in quotes."
else
	echo "$1"
fi

运行这个新版本的 hello.sh 会产生以下结果

$ bash hello.sh 
syntax: hello.sh WORD
If you provide more than one word, enclose them in quotes.
$ bash hello.sh "hello world"
hello world

逐步完成脚本

无论您是在寻找从 PDF 文件中删除图像的东西,还是管理您杂乱的“下载”文件夹的东西,还是创建和配置 Kubernetes 镜像的东西,学习编写 Bash 脚本都是一个使用 Bash 的过程,然后学习如何将这些脚本从仅仅是命令列表转换为可以响应输入的东西。这通常是一个发现的过程:您肯定会找到新的 Linux 命令,这些命令可以执行您从未想象过可以用文本命令执行的任务,并且您会找到 Bash 的新功能,使您的脚本能够适应您希望它们运行的所有不同方式。

学习这些技巧的一种方法是阅读其他人的脚本。感受人们如何在他们的系统上自动化重复性命令。看看哪些对您来说是熟悉的,并查找有关不熟悉的事物的更多信息。

另一种方法是下载我们的 Bash 编程入门 电子书。它向您介绍了 Bash 特有的编程概念,通过您学习的结构,您可以开始构建自己的命令。当然,它是免费下载的,并根据 知识共享 许可获得许可,所以今天就获取您的副本吧。

下载我们的 Bash 编程入门电子书!

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时从事这两个行业。

1 条评论

很棒的文章,Seth!谢谢!

© . All rights reserved.