Bash 脚本入门,系统管理员指南

学习使 Bash 成为最强大的 shell 之一的命令和功能。
107 位读者喜欢这篇文章。
Command line prompt

Opensource.com

Bash shell 绝对不是唯一的 shell,但它是最强大的 shell 之一。这使得它成为系统管理员开发严肃应用程序的热门选择,这些应用程序超越了在系统上运行的简单“任务清单”。其他 shell 有很多很棒的用途(例如,我默认使用 Tcsh 进行 Git 钩子),但 Bash 是严肃脚本编写的简单选择,原因如下。

函数

要在 Bash 脚本中创建函数,请使用关键字 function

function foo {
# code here
}

函数对于程序员很有用,因为它们有助于减少代码中的冗余。代码中冗余的减少减少了所需的维护量,因为如果您需要更改值,您只需找到一次(在其函数中)而不是每次使用它时都找到。

Bash 的优势

函数在 shell 中得到相当好的支持,但值得注意的是 Tcsh 除外。

  • Korn shell: 使用与 Bash 相同的语法
  • Zsh: 使用与 Bash 相同的语法
  • Fish: 使用自定义 function 命令来创建和操作函数
  • Tcsh: 有时,您可以通过使用 goto 语句来解决 Tcsh 中缺少函数的问题,但这很少是最佳选择。

重定向

输入和输出的重定向是任何编程和脚本语言中的一个相当标准的功能,当您使用 shell 时,它会自然而然地发生。您输入文本;您得到输出。有些 shell 比其他 shell 更强大,正如您可能猜到的那样,Bash 为您提供了几乎所有可以想象的选项。

基本知识很简单:使用一些 > 字符来重定向输出,并使用一些 < 字符来重定向输入。但是,对于特定类型的输入和输出,有一些特殊的指定。例如,错误消息会转到一个名为 stderr 的流,为了重定向的目的,它被指定为 2>。例如,此命令将错误消息定向到一个名为 output.log 的文件

$ ls /void 2> output.log

Bash 的优势

当与 shell 交互时,重定向是一个非常方便的功能,虽然所有主要的 shell 都支持某种形式的重定向,但并非所有功能都在所有 shell 中都可用。

  • Korn shell: 使用与 Bash 相同的语法
  • Zsh: 使用与 Bash 相同的语法
  • Fish: 部分支持
  • Tcsh: 部分支持

来源

当您在 shell 中 source 一个文件时,您正在将该文件导入到您的 shell 环境中。大多数 shell 都能熟练地处理这个问题,但有些 shell 提供了一些额外的功能以方便您。

例如,当您在 Bash 中使用 source 时,它会在当前目录中搜索您引用的文件。如果找不到要 source 的文件,它会搜索您的 PATH。这是一个小小的奖励,但它非常方便,因为它允许您将常用函数存储在驱动器上的集中位置,然后将您的环境视为集成开发环境 (IDE)。您不必担心您的函数存储在哪里,因为您知道它们在您本地等同于 /usr/include 的位置,因此无论您在何处 source 它们,Bash 都会找到它们。

Bash 的优势

当您使用 source 命令或缩写(和 POSIX 兼容) . 表示法时,Bash 是唯一同时搜索当前目录和您的 PATH 的 shell。

按键绑定

许多 shell 允许您自定义与它们的交互方式,当然,与基于文本的界面的任何交互都始于键入。在 Bash 中,您可以查看当前的键盘映射

$ bind -V | grep keymap

要更改您的键盘映射(例如,从 Emacs 更改为 Vi)

$ bind 'set keymap vi'

Bash 的优势

只有 Bash 和 Zsh 提供内置的按键绑定预设。

历史记录

Bash 拥有所有 shell 中最强大的命令历史记录界面。Bash 版本的 history 允许反向搜索、快速调用、历史记录编辑(包括按行号删除条目)等等。所有其他 shell 的历史记录界面加起来都与 Bash 的历史记录界面相匹配,但没有一个(即使是通常模仿 Bash 的 Zsh)能单独匹配它。

历史记录操作

history 命令不是与您的过去交互的唯一方式。Bash 拥有丰富的速记表示法集合,使您能够回忆甚至修改 shell 历史记录中的命令。

例如,要再次运行最近的命令(&nbsp;history | tail -n1 的输出,使用前导空格,此处用 &nbsp;,  表示,以将 history 命令保留在您的历史记录之外),您只需在 Bash 中键入 !!

$ wc -w luarocks.xml
1284 luarocks.xml
$ !!
1284 luarocks.xml

要在运行最近的命令时将该命令的一部分替换为其他内容,您可以使用字符串替换

$ wc -w luarocks.xml
1284 luarocks.xml
$ ^-w^-l
$ wc -l luarocks.xml
214 luarocks.xml

有许多这样的快捷方式,所有这些都记录在 Bash 手册页和信息页中。诚然,这些技巧中的许多技巧都是为高级用户设计的,对于他们来说,Bash 交互是如此重复和单调,以至于晦涩难懂、看似随机的按键组合很有用。Zsh 有效地模仿了 Bash,但没有其他 shell 提供这种最大化的效率。

Bash 的优势

Bash 的历史记录命令是任何其他 shell 都无法比拟的(Zsh 接近,但缺少一些选项,例如按行号删除的能力)。

关联数组

大多数 shell 都提供创建、操作和查询索引数组的功能。用通俗易懂的英语来说,索引数组是以数字为前缀的事物列表。这个事物列表以及它们分配的数字被方便地包装在一个变量中,这使得在您的代码中“携带”它变得容易。

然而,Bash 包括创建关联数组的能力,并将这些数组与任何其他数组一样对待。关联数组允许您创建键值对列表,而不是仅仅是编号的值。

关联数组的好处是键可以是任意的

$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`

查询任何键

$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192

您可以从数组中获得大多数常见的数组操作。

Bash 的优势

Bash 是唯一提供对关联数组完全支持的 shell(同样,Zsh 接近,但缺少列出键的函数)。

选择 Bash 进行 shell 脚本编写

Bash 中的一些便利性不符合 POSIX 标准。从理论上讲,这意味着您可以编写一个 Bash 脚本,该脚本在没有 Bash 的系统上无法按预期运行。如果发生这种情况,则称您的脚本不是“可移植的”。

但在实践中,Bash 是免费和开源软件,因此任何人都可以安装它,无论他们运行的是 Linux、BSD、OpenIndiana、Windows 还是 macOS。安装 Bash 不需要用户将 Bash 用作其默认 shell,甚至不需要有意识地启动它,因为一个好的 shell 脚本会在其顶部的 shebang 行中标识它使用的 shell(例如,#!/bin/bash)。

如有疑问,请在您的文档中包含 Bash 作为 shell 脚本的依赖项(即使它是唯一的依赖项),以提醒用户它是 Bash 脚本而不是通用 shell 脚本。

Bash 有许多便利性,我发现这些便利性超过了对用户是否安装了 Bash 的担忧。就像 Python 或 Java 或任何其他软件一样,有时存在依赖项。如果您喜欢 Bash 并发现其速记和快捷方式很有用,请不要委屈自己。

下载我们关于系统管理员 Bash 脚本编写的电子书!

接下来阅读什么

Bash 脚本自动化简介

在本四部分系列文章的第一篇中,学习如何创建简单的 shell 脚本以及为什么它们是自动化任务的最佳方式。

(通讯员)
2019 年 12 月 18 日
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时从事这两个行业。

评论已关闭。

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