我是如何开始编写 bash 脚本的

通过几次简单的 Google 搜索,一位编程新手学会了编写代码,从而自动化了以前繁琐且耗时的任务。
522 位读者喜欢这篇文章。
Perl tricks for system administrators

Opensource.com

前几天我写了一个脚本。对于你们中的一些人来说,这句话听起来没什么大不了的。但对于另一些人来说,我知道你们就在那里,这句话意义重大。你看,我不是程序员。我是一名作家。

我需要解决的问题

我的问题很简单:我必须将工程文件整理到我们的文档中。这些文件以 .zip 格式从 Web URL 获取。我之前是手动将它们复制到我的桌面,然后再将它们移动到不同的目录结构中,以满足我的文档需求。一位作家同事给了我这个建议:“你为什么不写一个脚本来帮你做这件事呢?”

我心想“就写个脚本?!?”——好像这是世界上最容易的事情一样。

Google 如何提供帮助

我同事的问题让我开始思考,在思考的过程中,我使用了 Google 搜索。

Linux 上有哪些脚本语言?

这是我的第一个 Google 搜索条件,你们中的许多人可能在想,“她真够笨的。” 嗯,我确实很笨,但这确实让我走上了解决问题的道路。最常见的结果是 Bash。嗯,我见过 Bash。天哪,我必须记录的一个文件里就有 Bash,那行无处不在的 #!/bin/bash。我再次查看了那个文件,我知道它在做什么,因为我必须记录它。

所以这引导我进行了下一次 Google 搜索请求。

如何从 URL 下载 zip 文件?

这真的是我的基本任务。我有一个 URL,其中包含一个 .zip 文件,其中包含我需要包含在文档中的所有文件,所以我请求万能的 Google 帮助我。这个搜索结果,以及其他一些结果,引导我找到了 Curl。但最棒的是:我不仅找到了 Curl,而且其中一个热门搜索结果还向我展示了一个 Bash 脚本,该脚本使用 Curl 下载 .zip 文件并将其解压缩。这超出了我的要求,但那时我意识到,在 Google 搜索请求中具体说明可以为我提供编写此脚本所需的信息。因此,在势头的推动下,我编写了最简单的脚本

#!/bin/sh

curl http://rather.long.url | tar -xz -C my_directory --strip-components=1

看到它运行的那一刻真是太棒了!但是,我随后意识到一个问题:URL 可能会更改,具体取决于我要访问的文件集。我还有另一个问题要解决,这引导我进行了下一次搜索。

如何将参数传递到 Bash 脚本中?

我需要能够使用不同的 URL 和不同的目标目录来运行此脚本。Google 向我展示了如何在脚本中使用 $1$2 等来替换我在命令行中输入的内容。例如

bash myscript.sh http://rather.long.url my_directory

这样就好多了。一切都按我的需要工作,我很灵活,我有一个可用的脚本,最重要的是,我有一个简短的命令可以输入,从而节省了我 30 分钟的复制粘贴苦力活。那是一个有意义的上午。

然后我意识到我还有一个问题。你看,我的记忆力很差,而且我知道我每隔几个月才会运行一次这个脚本。这给我留下了两个问题

  • 我如何记住我的脚本要输入什么(先输入 URL?还是先输入目录?)?
  • 如果我被卡车撞了,另一位作家如何知道如何运行我的脚本?

我需要一条用法消息——如果我使用不正确,脚本会显示一些内容。例如

usage: bash yaml-fetch.sh <'snapshot_url'> <directory>

否则,运行脚本。我的下一次搜索是

如何在 Bash 脚本中编写“if/then/else”?

幸运的是,我已经知道编程中存在 if/then/else。我只需要弄清楚如何做到这一点。在此过程中,我还学会了使用 echo 从 Bash 脚本打印内容。我最终得到的是这样的东西

#!/bin/sh

URL=$1
DIRECTORY=$2

if [ $# -eq 0 ];
 then
 echo "usage: bash yaml-fetch.sh <'snapshot_url'> <directory>".
 else

     # make the directory if it doesn't already exist
 echo 'create directory'

 mkdir $DIRECTORY

 # fetch and untar the yaml files
 echo 'fetch and untar the yaml files'

 curl $URL | tar -xz -C $DIRECTORY --strip-components=1
fi

Google 和脚本编写如何震撼了我的世界

好吧,这里稍微夸张了一点,但这是 21 世纪,学习新事物(尤其是有些简单的事情)比过去容易得多。我学到的东西(除了如何编写一个简短的、自我记录的 Bash 脚本之外)是,如果我有一个问题,很可能以前有人遇到过相同或类似的问题。当我遇到困难时,我可以问下一个问题,再问下一个问题。最后,我不仅拥有一个脚本,还拥有了一项新技能的开端,我可以掌握并用它来简化我一直在避免的其他任务。

不要让第一个脚本(或编程步骤)难倒你。这是一种技能,就像任何其他技能一样,并且有很多信息可以帮助你。你不需要读一本厚厚的书或参加一个月的课程。你可以用更简单的方式来做,迈出小步,编写小的脚本来让你入门,然后在这种技能和你的信心基础上继续前进。总是需要有人编写那些数千行代码的程序,其中包含所有的分支、合并和错误修复。

但是,也迫切需要简单的脚本和其他自动化/简化任务的方法。而这正是一个小脚本和一点点自信可以帮助你快速入门的地方。

标签
User profile image.
Sandra McCann 是一位 Linux 和开源倡导者。她曾担任软件开发人员、学习资源的内容架构师和内容创作者。Sandra 目前是位于马萨诸塞州韦斯特福德的 Red Hat 的内容创作者,专注于 Ansible。

14 条评论

真是个精彩的故事。我仍然在日常工作中通过 bash 解决了很多任务。它适用于很多事情,我总是惊讶于 bash 脚本能做到什么程度。同事总是嘲笑我应该学习一些不同的东西,比如 python,但是只要我能用 bash 解决问题,我就会继续使用 bash ?。

一个建议.. 也许在创建目录之前检查一下目录是否存在。这样你只会在目录不存在时才创建它。

干杯 Oliver

你可以简单地使用 mkdir -p 而不是 mkdir 来做到这一点。man 手册中关于 -p 选项的说明是

“如果目录已存在,则不报错,并根据需要创建父目录”

回复 ,作者 Sandra McCann

如果有一个 Bash 101 入门课程,那么这就是新生入学周的“001 你好,Bash 学生们!”演示文稿。

这太棒了!最重要的是,它教授了获取信息的方法(实际上,这几乎是我们现在大多数人学习的方式),而不是仅仅是基本命令。

Slackware 的软件包管理工具都是用 Bash 编写的。这很好,因为它易于阅读、理解和移植。我曾在 RISC Debian 机器上使用过 slackpkg 和相关工具,并且非常喜欢它。

由此,我了解到不要低估或贬低 Bash 作为工具的价值,以及 POSIX 与 shell 脚本的集成。我知道其他操作系统也可以编写脚本,但我还没有见过一个像 POSIX 那样尊重用户的操作系统。

一个很棒的工具,可以验证你编写的内容并提供推荐的修复方案 Shellcheck。https://www.shellcheck.net/

这似乎确实是一个很棒的工具。感谢分享。

回复 ,作者 Kenny Jones (未验证)

嗨,Sandra!
这启发了我开始编写 Bash 脚本。我刚刚编写了一个脚本,用于在最新的构建文件夹创建后立即下载它!从现在开始关注你的博客!

谢谢大家!评论区里有很多有用的补充。

你需要检查命令行参数是否不小于 2。你当前的用法消息仅在你没有给出任何命令时才会显示。

很高兴感到自己被赋能。恭喜。

哦,谢谢 John!我一定要添加那个检查!

回复 ,作者 John Keiffer (未验证)

我仍然是个新手,所以这一切对我来说都很新鲜...我将继续努力学习所有我能用 Bash 学到的东西。当然还有 Linux,似乎这两者就像...花生酱和巧克力一样密不可分!感谢这篇非常有信息量的文章!!

#!/bin/sh 和 #!/bin/bash 之间存在差异

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.