Bash 脚本教程 – 适合初学者的 Linux Shell 脚本和命令行

849 阅读6分钟

在 Linux 中,流程自动化严重依赖 shell 脚本。这涉及创建一个包含一系列可以一起执行的命令的文件。

在本文中,我们将从 bash 脚本编写的基础知识开始,其中包括变量、命令、输入/输出和调试。我们还将看到每个示例。

让我们开始吧。🚀

目录

先决条件

介绍

Bash 脚本的定义

Bash 脚本的优点

Bash shell 和命令行界面概述

如何开始使用 Bash 脚本

从命令行运行 Bash 命令

如何创建和执行 Bash 脚本

脚本命名约定

添加 Shebang

创建我们的第一个 bash 脚本

执行bash脚本

Bash 脚本基础知识

bash 脚本中的注释

Bash 中的变量和数据类型

变量命名约定

Bash 脚本中的输入和输出

收集输入

显示输出

基本 Bash 命令(echo、read 等)

条件语句(if/else)

Bash 中的循环和分支

While 循环

For循环

案例陈述

如何使用 cron 安排脚本

使用crontab

如何调试 Bash 脚本并排除故障

设置set -x选项

检查退出代码

使用echo语句

使用set -e选项

通过验证日志排除 cron 故障

结论


先决条件

要学习本教程,您应该具有以下访问权限:

  • 可以访问命令行的 Linux 运行版本。

如果您没有安装 Linux 或者刚刚开始使用,您可以通过Replit轻松访问 Linux 命令行。Replit 是一个基于浏览器的 IDE,您可以在几分钟内访问 bash shell。

您还可以使用 WSL(适用于 Linux 的 Windows 子系统)在 Windows 系统之上安装 Linux。是一个教程。

介绍

Bash 脚本的定义

bash 脚本是一个包含 bash 程序逐行执行的一系列命令的文件。它允许您执行一系列操作,例如导航到特定目录、创建文件夹以及使用命令行启动进程。

通过将这些命令保存在脚本中,您可以多次重复相同的步骤序列并通过运行脚本来执行它们。

Bash 脚本的优点

Bash 脚本是一个强大且多功能的工具,用于在 Unix/Linux 系统中自动执行系统管理任务、管理系统资源以及执行其他例行任务。shell 脚本的一些优点是:

  • 自动化:Shell 脚本允许您自动执行重复的任务和流程,从而节省时间并降低手动执行时可能发生的错误风险。
  • 可移植性:Shell脚本可以通过使用模拟器或虚拟机在各种平台和操作系统上运行,包括Unix、Linux、macOS,甚至Windows。
  • 灵活性:Shell 脚本是高度可定制的,可以轻松修改以满足特定要求。它们还可以与其他编程语言或实用程序结合使用来创建更强大的脚本。
  • 可访问性:Shell 脚本易于编写,不需要任何特殊的工具或软件。它们可以使用任何文本编辑器进行编辑,并且大多数操作系统都有内置的 shell 解释器。
  • 集成:Shell 脚本可以与其他工具和应用程序集成,例如数据库、Web 服务器和云服务,从而允许执行更复杂的自动化和系统管理任务。
  • 调试:Shell 脚本很容易调试,大多数 shell 都有内置的调试和错误报告工具,可以帮助快速识别和修复问题。

Bash shell 和命令行界面概述

术语“shell”和“bash”可以互换使用。但两者之间有一个微妙的区别。

术语“shell”是指提供用于与操作系统交互的命令行界面的程序。Bash (Bourne-Again SHell) 是最常用的 Unix/Linux shell 之一,也是许多 Linux 发行版中的默认 shell。

shell 或命令行界面如下所示:

编辑

shell 接受用户的命令并显示输出

在上面的输出中,zaira@Zaira是 shell 提示符。当以交互方式使用 shell 时,它会$在等待用户命令时显示 。

如果 shell 以 root(具有管理权限的用户)身份运行,则提示符将更改为#。超级用户 shell 提示符如下所示:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#999999">[</span>root@host ~<span style="color:#999999">]</span><span style="color:#708090">#</span></code></span>

尽管 Bash 是一种 shell,但还有其他可用的 shell,例如 Korn shell (ksh)、C shell (csh) 和 Z shell (zsh)。每个 shell 都有自己的语法和功能集,但它们都有一个共同的目的,即提供与操作系统交互的命令行界面。

您可以使用以下ps命令确定您的 shell 类型:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">ps</span></code></span>

这是我的输出:

编辑

检查外壳类型。我正在使用 bash shell

总之,“shell”是一个广泛的术语,指的是任何提供命令行界面的程序,而“Bash”是一种在 Unix/Linux 系统中广泛使用的特定类型的 shell。

注意:在本教程中,我们将使用“bash”shell。

如何开始使用 Bash 脚本

从命令行运行 Bash 命令

如前所述,shell 提示符如下所示:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#999999">[</span>username@host ~<span style="color:#999999">]</span>$</code></span>

您可以在该符号后输入任何命令$并在终端上查看输出。

通常,命令遵循以下语法:

command [OPTIONS] arguments

让我们讨论一些基本的 bash 命令并查看它们的输出。请务必遵循:)

  • date:显示当前日期
<span style="color:var(--gray85)"><code class="language-bash">zaira@Zaira:~/shell-tutorial$ <span style="color:#dd4a68">date</span>
Tue Mar <span style="color:#990055">14</span> <span style="color:#990055">13</span>:08:57 PKT <span style="color:#990055">2023</span></code></span>

  • pwd:显示当前工作目录。
<span style="color:var(--gray85)"><code class="language-bash">zaira@Zaira:~/shell-tutorial$ <span style="color:#dd4a68">pwd</span>
/home/zaira/shell-tutorial</code></span>

  • ls:列出当前目录的内容。
<span style="color:var(--gray85)"><code class="language-bash">zaira@Zaira:~/shell-tutorial$ <span style="color:#dd4a68">ls</span>
check_plaindrome.sh  count_odd.sh  <span style="color:#dd4a68">env</span>  log  temp</code></span>

  • echo:将文本字符串或变量值打印到终端。
<span style="color:var(--gray85)"><code class="language-bash">zaira@Zaira:~/shell-tutorial$ <span style="color:#dd4a68">echo</span> <span style="color:#669900">"Hello bash"</span>
Hello <span style="color:#dd4a68">bash</span></code></span>

您可以随时参考命令手册中的命令man

例如,手册ls看起来像这样:

编辑

您可以使用命令详细查看选项man

如何创建和执行 Bash 脚本

脚本命名约定

根据命名约定,bash 脚本以.sh. 然而,bash 脚本在没有扩展名的情况下也可以完美运行sh

添加 Shebang

Bash 脚本以shebang. Shebang 是bash shell 路径的bash #组合。bang !这是脚本的第一行。Shebang 告诉 shell 通过 bash shell 执行它。Shebang 只是 bash 解释器的绝对路径。

下面是 shebang 语句的示例。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong></code></span>

您可以使用以下命令找到您的 bash shell 路径(可能与上面的有所不同):

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">which</span> <span style="color:#dd4a68">bash</span></code></span>

创建我们的第一个 bash 脚本

我们的第一个脚本提示用户输入路径。作为回报,其内容将被列出。

run_all.sh创建一个使用命令命名的文件vi。您可以使用您选择的任何编辑器。

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">vi</span> run_all.sh</code></span>

在文件中添加以下命令并保存:

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>
<span style="color:#dd4a68">echo</span> <span style="color:#669900">"Today is "</span> <span style="color:#ee9900"><span style="color:#ee9900">`</span><span style="color:#dd4a68">date</span><span style="color:#ee9900">`</span></span>

<span style="color:#dd4a68">echo</span> <span style="color:#ee9900">-e</span> <span style="color:#669900">"<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">\n</span></span>enter the path to directory"</span>
<span style="color:#dd4a68">read</span> the_path

<span style="color:#dd4a68">echo</span> <span style="color:#ee9900">-e</span> <span style="color:#669900">"<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">\n</span></span> you path has the following files and folders: "</span>
<span style="color:#dd4a68">ls</span> <span style="color:#ee9900">$the_path</span></code></span>

用于打印用户提供的目录内容的脚本

让我们逐行更深入地查看脚本。我再次显示相同的脚本,但这次带有行号。  

<span style="color:var(--gray85)"><code class="language-bash">  <span style="color:#990055">1</span> <span style="color:#708090">#!/bin/bash</span>
  <span style="color:#990055">2</span> <span style="color:#dd4a68">echo</span> <span style="color:#669900">"Today is "</span> <span style="color:#ee9900"><span style="color:#ee9900">`</span><span style="color:#dd4a68">date</span><span style="color:#ee9900">`</span></span>
  <span style="color:#990055">3</span>
  <span style="color:#990055">4</span> <span style="color:#dd4a68">echo</span> <span style="color:#ee9900">-e</span> <span style="color:#669900">"<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">\n</span></span>enter the path to directory"</span>
  <span style="color:#990055">5</span> <span style="color:#dd4a68">read</span> the_path
  <span style="color:#990055">6</span>
  <span style="color:#990055">7</span> <span style="color:#dd4a68">echo</span> <span style="color:#ee9900">-e</span> <span style="color:#669900">"<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">\n</span></span> you path has the following files and folders: "</span>
  <span style="color:#990055">8</span> <span style="color:#dd4a68">ls</span> <span style="color:#ee9900">$the_path</span></code></span>

  • 第 1 行:shebang ( #!/bin/bash) 指向 bash shell 路径。
  • 第 2 行:该echo命令正在终端上显示当前日期和时间。请注意, 是date用反引号括起来的。
  • 第 4 行:我们希望用户输入有效的路径。
  • 第 5 行:该read命令读取输入并将其存储在变量 中the_path
  • 第 8 行:该ls命令采用带有存储路径的变量并显示当前文件和文件夹。

执行bash脚本

要使脚本可执行,请使用以下命令向您的用户分配执行权限:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">chmod</span> u+x run_all.sh</code></span>

这里,

  • chmod修改当前用户的文件所有权:u.
  • +x为当前用户添加执行权限。这意味着所有者用户现在可以运行该脚本。
  • run_all.sh是我们要运行的文件。

您可以使用上述任何方法运行该脚本:

  • sh run_all.sh
  • bash run_all.sh
  • ./run_all.sh

让我们看看它的实际运行情况 🚀

编辑

Bash 脚本基础知识

bash 脚本中的注释

注释以#bash 脚本开始。这意味着任何以 a 开头的行#都是注释,将被解释器忽略。

注释对于记录代码非常有帮助,添加注释以帮助其他人理解代码是一个很好的做法。

这些是评论的示例:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#708090"># This is an example comment</span>
<span style="color:#708090"># Both of these lines will be ignored by the interpreter</span></code></span>

Bash 中的变量和数据类型

变量让您可以存储数据。您可以使用变量来读取、访问和操作整个脚本中的数据。

Bash 中没有数据类型。在 Bash 中,变量能够存储数值、单个字符或字符串。

在 Bash 中,您可以通过以下方式使用和设置变量值:

  1. 直接赋值:
<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#ee9900">country</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span>Pakistan</code></span>

  1. 使用命令替换,根据从程序或命令获得的输出来分配值。请注意,$需要访问现有变量的值。
<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#ee9900">same_country</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span><span style="color:#ee9900">$country</span></code></span>

这会将 的值分配country给新变量same_country

要访问变量值,请附加$到变量名称。

<span style="color:var(--gray85)"><code class="language-bash">zaira@Zaira:~$ <span style="color:#ee9900">country</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span>Pakistan
zaira@Zaira:~$ <span style="color:#dd4a68">echo</span> <span style="color:#ee9900">$country</span>
Pakistan
zaira@Zaira:~$ <span style="color:#ee9900">new_country</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span><span style="color:#ee9900">$country</span>
zaira@Zaira:~$ <span style="color:#dd4a68">echo</span> <span style="color:#ee9900">$new_country</span>
Pakistan</code></span>

分配和打印变量值

变量命名约定

在 Bash 脚本中,以下是变量命名约定:

  1. 变量名称应以字母或下划线 ( _) 开头。
  2. 变量名称可以包含字母、数字和下划线 ( _)。
  3. 变量名称区分大小写。
  4. 变量名不应包含空格或特殊字符。
  5. 使用反映变量用途的描述性名称。
  6. 避免使用保留关键字,例如ifthenelsefi等作为变量名。

以下是 Bash 中有效变量名称的一些示例:

<span style="color:var(--gray85)"><code class="language-bash">name
count
_var
myVar
MY_VAR
</code></span>

以下是无效变量名称的一些示例:

<span style="color:var(--gray85)"><code class="language-bash">2ndvar <span style="color:#999999">(</span>variable name starts with a number<span style="color:#999999">)</span>
my var <span style="color:#999999">(</span>variable name contains a space<span style="color:#999999">)</span>
my-var <span style="color:#999999">(</span>variable name contains a hyphen<span style="color:#999999">)</span>
</code></span>

遵循这些命名约定有助于使 Bash 脚本更具可读性且更易于维护。

Bash 脚本中的输入和输出

收集输入

在本节中,我们将讨论一些为脚本提供输入的方法。

  1. 读取用户输入并将其存储在变量中

我们可以使用命令读取用户输入read

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>
<span style="color:#dd4a68">echo</span> <span style="color:#669900">"Today is "</span> <span style="color:#ee9900"><span style="color:#ee9900">`</span><span style="color:#dd4a68">date</span><span style="color:#ee9900">`</span></span>

<span style="color:#dd4a68">echo</span> <span style="color:#ee9900">-e</span> <span style="color:#669900">"<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">\n</span></span>enter the path to directory"</span>
<span style="color:#dd4a68">read</span> the_path

<span style="color:#dd4a68">echo</span> <span style="color:#ee9900">-e</span> <span style="color:#669900">"<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">\n</span></span>your path has the following files and folders: "</span>
<span style="color:#dd4a68">ls</span> <span style="color:#ee9900">$the_path</span></code></span>

编辑

  1. 从文件中读取

此代码从名为 的文件中读取每一行input.txt并将其打印到终端。我们将在本文后面研究 while 循环。

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#0077aa">while</span> <span style="color:#dd4a68">read</span> line
<span style="color:#0077aa">do</span>
  <span style="color:#dd4a68">echo</span> <span style="color:#ee9900">$line</span>
<span style="color:#0077aa">done</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a"><</span></span> input.txt
</code></span>

  1. 命令行参数

在 bash 脚本或函数中,$1表示传递的初始参数,$2表示传递的第二个参数,依此类推。

该脚本将名称作为命令行参数并打印个性化问候语。

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">echo</span> <span style="color:#669900">"Hello, <span style="color:#ee9900">$1</span>!"</span>
</code></span>

我们已将Zaira其作为参数提供给脚本。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>
<span style="color:#dd4a68">echo</span> <span style="color:#669900">"Hello, <span style="color:#ee9900">$1</span>!"</span></code></span>

脚本的代码:greeting.sh

输出:

编辑

显示输出

在这里,我们将讨论一些从脚本接收输出的方法。

  1. 打印到终端:
<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">echo</span> <span style="color:#669900">"Hello, World!"</span>
</code></span>

这将打印文本“Hello, World!” 到航站楼。

2.写入文件:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">echo</span> <span style="color:#669900">"This is some text."</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span> output.txt
</code></span>

这会写入文本“这是一些文本”。到一个名为output.txt. 请注意,>如果文件已有某些内容,则操作员会覆盖该文件。

  1. 追加到文件:
<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">echo</span> <span style="color:#669900">"More text."</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">>></span></span> output.txt
</code></span>

这会附加文本“更多文本”。到文件末尾output.txt

4.重定向输出:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#dd4a68">ls</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span> files.txt
</code></span>

这会列出当前目录中的文件并将输出写入名为files.txt. 您可以通过这种方式将任何命令的输出重定向到文件。

基本 Bash 命令(echo、read 等)

以下是一些最常用的 bash 命令的列表:

  1. cd:将目录更改到其他位置。
  2. ls:列出当前目录的内容。
  3. mkdir:新建一个目录。
  4. touch:创建一个新文件。
  5. rm:删除文件或目录。
  6. cp:复制文件或目录。
  7. mv:移动或重命名文件或目录。
  8. echo:将文本打印到终端。
  9. cat:连接并打印文件的内容。
  10. grep:在文件中搜索模式。
  11. chmod:更改文件或目录的权限。
  12. sudo:以管理权限运行命令。
  13. df:显示可用磁盘空间量。
  14. history:显示以前执行过的命令的列表。
  15. ps:显示正在运行的进程的信息。

条件语句(if/else)

产生布尔结果(真或假)的表达式称为条件。有多种方法可以评估条件,包括ifif-elseif-elif-else和嵌套条件。

语法

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#0077aa">if</span> <span style="color:#999999">[</span><span style="color:#999999">[</span> condition <span style="color:#999999">]</span><span style="color:#999999">]</span><span style="color:#999999">;</span>
<span style="color:#0077aa">then</span>
	statement
<span style="color:#0077aa">elif</span> <span style="color:#999999">[</span><span style="color:#999999">[</span> condition <span style="color:#999999">]</span><span style="color:#999999">]</span><span style="color:#999999">;</span> <span style="color:#0077aa">then</span>
	statement 
<span style="color:#0077aa">else</span>
	<span style="color:#0077aa">do</span> this by default
<span style="color:#0077aa">fi</span></code></span>

bash 条件语句的语法

我们可以使用AND -a、OR等逻辑运算符-o来进行更有意义的比较。

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#0077aa">if</span> <span style="color:#999999">[</span> <span style="color:#ee9900">$a</span> <span style="color:#ee9900">-gt</span> <span style="color:#990055">60</span> <span style="color:#ee9900">-a</span> <span style="color:#ee9900">$b</span> <span style="color:#ee9900">-lt</span> <span style="color:#990055">100</span> <span style="color:#999999">]</span></code></span>

该语句检查两个条件是否为true:a 大于 60 AND b 小于 100。

让我们看一个 Bash 脚本示例,该脚本使用ifif-elseif-elif-else语句来确定用户输入的数字是正数、负数还是零:

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>

<span style="color:#dd4a68">echo</span> <span style="color:#669900">"Please enter a number: "</span>
<span style="color:#dd4a68">read</span> num

<span style="color:#0077aa">if</span> <span style="color:#999999">[</span> <span style="color:#ee9900">$num</span> <span style="color:#ee9900">-gt</span> <span style="color:#990055">0</span> <span style="color:#999999">]</span><span style="color:#999999">;</span> <span style="color:#0077aa">then</span>
  <span style="color:#dd4a68">echo</span> <span style="color:#669900">"<span style="color:#ee9900">$num</span> is positive"</span>
<span style="color:#0077aa">elif</span> <span style="color:#999999">[</span> <span style="color:#ee9900">$num</span> <span style="color:#ee9900">-lt</span> <span style="color:#990055">0</span> <span style="color:#999999">]</span><span style="color:#999999">;</span> <span style="color:#0077aa">then</span>
  <span style="color:#dd4a68">echo</span> <span style="color:#669900">"<span style="color:#ee9900">$num</span> is negative"</span>
<span style="color:#0077aa">else</span>
  <span style="color:#dd4a68">echo</span> <span style="color:#669900">"<span style="color:#ee9900">$num</span> is zero"</span>
<span style="color:#0077aa">fi</span>
</code></span>

确定数字是正数、负数还是零的脚本

该脚本首先提示用户输入一个数字。然后,它使用if语句检查该数字是否大于 0。如果是,则脚本输出该数字为正数。如果该数字不大于 0,则脚本将继续执行下一条语句,即一条if-elif语句。此处,脚本检查该数字是否小于 0。如果是,则脚本输出该数字为负数。最后,如果该数字既不大于 0 也不小于 0,则脚本使用语句else输出该数字为零。

看到它的实际效果🚀

编辑

Bash 中的循环和分支

While 循环

While 循环检查条件并循环直到条件成立true。我们需要提供一个计数器语句来增加计数器以控制循环执行。

在下面的示例中,(( i += 1 ))是递增 的值的计数器语句i。该循环将恰好运行 10 次。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>
<span style="color:#ee9900">i</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span><span style="color:#990055">1</span>
<span style="color:#0077aa">while</span> <span style="color:#999999">[</span><span style="color:#999999">[</span> <span style="color:#ee9900">$i</span> <span style="color:#ee9900">-le</span> <span style="color:#990055">10</span> <span style="color:#999999">]</span><span style="color:#999999">]</span> <span style="color:#999999">;</span> <span style="color:#0077aa">do</span>
   <span style="color:#dd4a68">echo</span> <span style="color:#669900">"<span style="color:#ee9900">$i</span>"</span>
  <span style="color:#ee9900"><span style="color:#999999">((</span> i <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">+=</span></span> <span style="color:#990055">1</span> <span style="color:#999999">))</span></span>
<span style="color:#0077aa">done</span></code></span>

迭代 10 次的 While 循环。

编辑

For循环

循环与循环for一样while,允许您执行特定次数的语句。每个循环的语法和用法都不同。

在下面的示例中,循环将迭代 5 次。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>

<span style="color:#0077aa">for</span> <span style="color:#ee9900">i</span> <span style="color:#0077aa">in</span> <span style="color:#999999">{</span><span style="color:#990055">1</span><span style="color:#999999">..</span><span style="color:#990055">5</span><span style="color:#999999">}</span>
<span style="color:#0077aa">do</span>
    <span style="color:#dd4a68">echo</span> <span style="color:#ee9900">$i</span>
<span style="color:#0077aa">done</span></code></span>

迭代 5 次的 For 循环。

编辑

案例陈述

在 Bash 中,case 语句用于将给定值与模式列表进行比较,并根据第一个匹配的模式执行代码块。Bash 中 case 语句的语法如下:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#0077aa">case</span> expression <span style="color:#0077aa">in</span>
    pattern1<span style="color:#999999">)</span>
        <span style="color:#708090"># code to execute if expression matches pattern1</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
    pattern2<span style="color:#999999">)</span>
        <span style="color:#708090"># code to execute if expression matches pattern2</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
    pattern3<span style="color:#999999">)</span>
        <span style="color:#708090"># code to execute if expression matches pattern3</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
    *<span style="color:#999999">)</span>
        <span style="color:#708090"># code to execute if none of the above patterns match expression</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
<span style="color:#0077aa">esac</span>
</code></span>

Case 语句语法

这里,“表达式”是我们要比较的值,“pattern1”、“pattern2”、“pattern3”等是我们要与之比较的模式。

双分号“;;” 分隔每个模式要执行的每个代码块。星号“*”代表默认情况,如果没有指定模式与表达式匹配,则执行默认情况。

让我们看一个例子。

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#ee9900">fruit</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span><span style="color:#669900">"apple"</span>

<span style="color:#0077aa">case</span> <span style="color:#ee9900">$fruit</span> <span style="color:#0077aa">in</span>
    <span style="color:#669900">"apple"</span><span style="color:#999999">)</span>
        <span style="color:#dd4a68">echo</span> <span style="color:#669900">"This is a red fruit."</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
    <span style="color:#669900">"banana"</span><span style="color:#999999">)</span>
        <span style="color:#dd4a68">echo</span> <span style="color:#669900">"This is a yellow fruit."</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
    <span style="color:#669900">"orange"</span><span style="color:#999999">)</span>
        <span style="color:#dd4a68">echo</span> <span style="color:#669900">"This is an orange fruit."</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
    *<span style="color:#999999">)</span>
        <span style="color:#dd4a68">echo</span> <span style="color:#669900">"Unknown fruit."</span>
        <span style="color:#999999">;</span><span style="color:#999999">;</span>
<span style="color:#0077aa">esac</span>
</code></span>

案例陈述示例

在此示例中,由于“fruit”的值为“apple”,因此第一个模式匹配,并且代码块回显“This is a redfruit”。被执行。如果“fruit”的值是“banana”,则第二个模式将匹配,并且代码块会回显“This is a Yellow Fruit”。将执行,等等。如果“fruit”的值与任何指定模式都不匹配,则执行默认情况,即回显“未知水果”。

如何使用 cron 安排脚本

Cron 是一个功能强大的作业调度实用程序,可在类 Unix 操作系统中使用。通过配置 cron,您可以设置自动化作业以每天、每周、每月或特定时间运行。cron 提供的自动化功能在 Linux 系统管理中发挥着至关重要的作用。

以下是安排 crons 的语法:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#708090"># Cron job example</span>
* * * * * <span style="color:#dd4a68">sh</span> /path/to/script.sh</code></span>

这里,*s分别代表分钟、小时、天、月、工作日。

以下是安排 cron 作业的一些示例。

日程描述例子
0 0 * * *每天午夜运行脚本0 0 * * * /path/to/script.sh
*/5 * * * *每 5 分钟运行一个脚本*/5 * * * * /path/to/script.sh
0 6 * * 1-5周一到周五早上 6 点运行脚本0 6 * * 1-5 /path/to/script.sh
0 0 1-7 * *在每月的前 7 天运行脚本0 0 1-7 * * /path/to/script.sh
0 12 1 * *每个月第一天中午运行一个脚本0 12 1 * * /path/to/script.sh

使用crontab

crontab实用程序用于添加和编辑 cron 作业。

crontab -l列出已为特定用户安排的脚本。

您可以通过添加和编辑 cron crontab -e

如何调试 Bash 脚本并排除故障

调试和故障排除是任何 Bash 脚本编写者的基本技能。虽然 Bash 脚本非常强大,但它们也很容易出现错误和意外行为。在本节中,我们将讨论一些调试和排除 Bash 脚本故障的技巧和技术。

设置set -x选项

调试 Bash 脚本最有用的技术之一是set -x在脚本开头设置选项。此选项启用调试模式,这会导致 Bash 将其执行的每个命令打印到终端,前面带有一个+符号。这对于识别脚本中发生错误的位置非常有帮助。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>

<span style="color:#dd4a68">set</span> <span style="color:#ee9900">-x</span>

<span style="color:#708090"># Your script goes here</span>
</code></span>

检查退出代码

当 Bash 遇到错误时,它会设置一个退出代码来指示错误的性质。您可以使用该变量检查最近命令的退出代码$?。值0表示成功,而任何其他值表示错误。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>

<span style="color:#708090"># Your script goes here</span>

<span style="color:#0077aa">if</span> <span style="color:#999999">[</span> <span style="color:#ee9900">$?</span> <span style="color:#ee9900">-ne</span> <span style="color:#990055">0</span> <span style="color:#999999">]</span><span style="color:#999999">;</span> <span style="color:#0077aa">then</span>
    <span style="color:#dd4a68">echo</span> <span style="color:#669900">"Error occurred."</span>
<span style="color:#0077aa">fi</span>
</code></span>

使用echo语句

echo调试 Bash 脚本的另一个有用技术是在整个代码中插入语句。这可以帮助您确定错误发生的位置以及传递给变量的值。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>

<span style="color:#708090"># Your script goes here</span>

<span style="color:#dd4a68">echo</span> <span style="color:#669900">"Value of variable x is: <span style="color:#ee9900">$x</span>"</span>

<span style="color:#708090"># More code goes here</span>
</code></span>

使用set -e选项

如果您希望脚本在脚本中的任何命令失败时立即退出,则可以使用该set -e选项。如果脚本中的任何命令失败,此选项将导致 Bash 退出并出现错误,从而更容易识别和修复脚本中的错误。

<span style="color:var(--gray85)"><code class="language-bash"><strong><span style="color:#ee9900">#!/bin/bash</span></strong>

<span style="color:#dd4a68">set</span> <span style="color:#ee9900">-e</span>

<span style="color:#708090"># Your script goes here</span>
</code></span>

通过验证日志排除 cron 故障

我们可以使用日志文件对 crons 进行故障排除。维护所有计划作业的日志。您可以在日志中检查和验证特定作业是否按预期运行。

对于 Ubuntu/Debian,您可以在以下位置找到cron日志:

<span style="color:var(--gray85)"><code class="language-bash">/var/log/syslog
</code></span>

其他发行版的位置有所不同。

cron 作业日志文件可能如下所示:

<span style="color:var(--gray85)"><code class="language-bash"><span style="color:#990055">2022</span>-03-11 00:00:01 Task started
<span style="color:#990055">2022</span>-03-11 00:00:02 Running script /path/to/script.sh
<span style="color:#990055">2022</span>-03-11 00:00:03 Script completed successfully
<span style="color:#990055">2022</span>-03-11 00:05:01 Task started
<span style="color:#990055">2022</span>-03-11 00:05:02 Running script /path/to/script.sh
<span style="color:#990055">2022</span>-03-11 00:05:03 Error: unable to connect to database
<span style="color:#990055">2022</span>-03-11 00:05:03 Script exited with error code <span style="color:#990055">1</span>
<span style="color:#990055">2022</span>-03-11 00:10:01 Task started
<span style="color:#990055">2022</span>-03-11 00:10:02 Running script /path/to/script.sh
<span style="color:#990055">2022</span>-03-11 00:10:03 Script completed successfully
</code></span>

定时日志

结论

在本文中,我们从如何访问终端开始,然后运行一些基本的 bash 命令。我们还研究了 bash shell 是什么。我们简要地了解了使用循环和条件来分支代码。最后,我们讨论了使用 cron 自动化脚本以及一些故障排除技术