【注】本文译自: An Introduction to Bash Scripting

Bash 脚本简介

幻想自己是计算机科学家、业余爱好者或技术书呆子吗?然后在某个时候,您将或应该考虑在您的数字工作区中使用 Bash 脚本。

Bash (Bourne Again Shell) 是一个解释器,负责处理Unix系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh(Bourne Shell)的替代品。Bash 被开发人员、数据科学家、系统管理员、网络工程师和任何其他在日常工作中严重依赖 Unix 操作系统的人使用。一般来说,Bash 脚本用于自动化计算机科学家可能承担的日常补救任务。简而言之,shell 脚本只不过是存储在一个文件(如列表)中的一系列命令。

您可以在 Linux 和 MacOS 机器上使用 Bash,甚至可以通过适用于 Linux 的 Windows 子系统在 Windows 10 机器上使用。Bash 通常在文本窗口中运行,用户可以在其中键入命令让计算机执行操作。该语言还可用于从文件读取和执行命令,称为 shell 脚本。Shell 脚本本身就是一种编程语言,与任何其他语言一样,Bash 是一种可以以多种方式使用的工具。

如果您之前见过运行 Linux 操作系统(或类 Unix 环境)的机器,您可能也见过终端控制台。终端是用户使用某些命令与 shell 解释器进行交互的方式。诸如 cd 导航文件目录,ls 列出当前目录中的文件,以及 nano 编辑文件等命令。

Unix 中的 Bash 终端示例

在终端中使用 Bash 代码,它将由 Bash 解释器运行。ls 之类的命令是位于 /bin 目录中的二进制可执行文件。 当 shell 收到该命令时(当您在终端中键入它并按 Enter 键时),它会执行 ls 文件并为用户列出当前目录中的文件。使用命令 ls /bin 以路径 /bin 作为选项执行二进制 ls,列出 /bin 目录中的文件。执行 ls -al 会运行带有标志 -a-l 作为选项的 ls 命令,列出当前目录路径中的所有文件和目录以及有关这些项目的详细信息。

touch 是另一个这样的二进制可执行文件,用户可以在终端中使用的命令。 此命令的输出是一个新文件,用户输入的名称作为选项。例如,用户可以编写 touch hello.txt,输出将是一个文件 hello.txt

如何运行多个 Bash 命令

要运行多个 Bash 命令并让它们一次执行,用户可以将这些命令保存在单个文件中,以便用 bash 执行。假设您在 Unix/类 Unix 环境中工作,让我们考虑一下我们之前讨论过的内容。

打开命令终端后,首先使用您喜欢的文本编辑器,例如 nanovi。写入:

nano make_a_file.txt

然后,写出以下内容:

#create a file
touch hello.txt

#list files from this directory
ls -al

保存并退出文件,并使用以下命令语法之一运行新脚本:

sh make_a_file.txt

./make_a_file.txt

bash make_a_file.txt

如果执行该文件时出错,请通过输入以下内容继续为您刚刚编写的脚本文件设置可执行权限:

chmod +x hello.sh

如果您遵循了这个示例,那么您刚刚创建了一个包含多个 Bash 命令的文件。Bash 解释器将按顺序运行这些命令并忽略以哈希符号 # 开头的行,因为这些行是注释。运行该文件会产生一个文件列表的终端输出,其中将包含一个 hello.txt,之前没有。

通常,一个 Bash 脚本文件以包含 .sh 扩展名的格式保存,这表明该文件是一个 shell 脚本。但是,当文件以“she-bang”或“hashbang”开头时,我们可以像二进制文件一样执行它。

在创建脚本时,我们应该考虑到每个二进制 shell 文件都以俗称的“she-bang”(也称为 sh-bang 或 hashbang)开头。这是脚本标题的开始,第一行代码指示您将使用哪个 shell。在制作脚本时,我们有多种选择可供选择,包括 shell (sh)C ShellZ Shell 等。在这种情况下,我们将继续使用 Bash 来满足我们的脚本需求。She-bang 是脚本开头的一组符号**“#”“!”**。我们知道井号 (#) 表示一行是注释。 然而,使用 she-bang,类 Unix 系统的程序解释器会将第一行的其余部分解析为解释器指令。在这种情况下,在写入 #!/bin/bash 时,哈希符号和感叹号作为程序加载器的指示符,指示它使用位于 /bin/bash 目录的 Bash Shell 程序。

如何在 Bash 中创建变量

像大多数其他 Unix shell 一样,Bash 具有变量、管道、文件名通配符、here 文档、命令替换和控制流。Bash 还支持交替(它与 C shell 共享)、命令行完成以及信号处理和基本调试。有了这些特性,bash 成为 Unix 和类 Unix 系统的默认命令解释器也就不足为奇了。

像其他编程语言一样,我们可以在使用 Bash 编写脚本时声明变量。但是,与其他语言不同,Bash 不需要关键字来声明变量或为其分配数据类型。Bash 没有类型系统,仅将变量保存为字符串值。但是,Bash 可以根据某些操作(例如算术运算)自动将变量转换为合适的类型。要写入变量并为其填充值,请以 VARIABLE=VALUE 格式写入内容,确保不包含空格。下面是一个示例,展示了如何在 Bash 中创建变量:

#!/bin/bash

#write a variable
NAME=“William”

#use that variable
echo “Hello $NAME”

用户还可以通过用户输入来填充变量:

#!/bin/bash

echo “Hello $1, that is a $2 name”

在终端中:

~$bash name.sh “William” “great”
Hello William, that is a great name

还可以使用 read 之类的命令在运行时使用用户输入的变量:

#!/bin/bash

echo “What is your name?”

read name

echo “Hello $name”

在终端中:

~$bash name.sh
What is your name?
~$William
Hello William

Bash 中的 if 语句

我们还可以为附加功能实现 if 语句。

#!/bin/bash

echo “Who is there?”

read name

if [ $name ]
echo “Hello $name”
else
 echo “Must’ve been my imagination”
fi

在终端中:

~$bash name.sh
Who is there?
~$
Must’ve been my imagination

如何在 Bash 中创建备份管理脚本

其他需要考虑的项目包括设置备份管理脚本。这可以是一个简单的项目,可以开始并在以后重新访问。有了这个,您可以制作一个简单的脚本,针对一个或多个文件和文件夹使用 tar 库进行压缩,并将其放置在您选择的新备份目录中。以下脚本是一个基本的备份脚本,它为需要备份的文件创建一个 .Zip 文件,并根据创建日期对它们进行标记:

#!/bin/bash

#get the month, day, and year of the current date
TIME_OF_BACKUP=`date +%m-%d-%y`

#create a backup file using the current date in its name
DESTINATION=/path/[BACKUP FOLDER]-$TIME_OF_BACKUP.tar.gz

#the folder that contains the files that we want to backup
TARGET_FOLDER=/path/[TARGET FOLDER]

#create the backup
tar -cpzf $DESTINATION $TARGET_FOLDER

作为奖励,您可能希望通过为备份脚本添加计划执行来增加此项目的一些复杂性,并增加自动化级别。为此,您可以使用 crontab 程序和命令库。如果您需要安装 cron,请确保在继续安装 cron 之前更新您当前的包库。

sudo apt-get update
sudo apt-get install cron

成功安装后,您可以继续使用 cron 库来安排脚本的执行。

crontab -e

这将打开 /etc/crontab 文件,并允许您编写如下命令来安排脚本的执行:

@weekly /path/backup_script.sh

我不会进一步讨论您可以使用 crontab 做什么,因为它不在本文的范围内。

总结

通过本入门指南,您将对什么是 Bash、什么是脚本以及 Bash 中的脚本有什么了解。你可以用 Bash 做很多事情,而且你不需要了解很多关于编程的知识,就可以将不同的 Linux 应用程序和工具拼凑在一起,并制作一些有用的东西。Bash 脚本是一个非常有用的工具,希望您能从这篇文章中获得灵感,让您的想法自动化。