跳转到内容

Bash Shell 脚本/入门练习

来自维基教科书,自由的教科书

我们将看几个例子,以了解 Bash 脚本可以用于什么。如果您现在还不理解,请不要担心。

Hello World

[编辑 | 编辑源代码]

让我们从一个简单的 "hello world" 程序开始

echo 'Hello, world!'

我们可以直接在 Bash 提示符中键入它,或者将其另存为文件(例如,hello_world.sh)并通过在 Bash 提示符中键入 bash hello_world.sh./hello_world.sh 来运行它。(稍后我们将看到一些更复杂的方法来创建和运行 Bash 脚本文件。)无论哪种情况,它都会打印 Hello, world!

$ echo 'Hello, world!'
Hello, world!

在这里我们使用 $ 符号来表示 Bash 提示符:在 $ 之后,该行的其余部分显示我们键入的命令,下一行显示该命令的输出。

检查文件

[编辑 | 编辑源代码]

这是一个稍微复杂一点的脚本

if [[ -e readme.txt ]] ; then
  echo 'The file "readme.txt" exists.'
else
  echo 'The file "readme.txt" does not exist.'
fi

这个脚本测试当前目录中是否存在名为 readme.txt 的文件,并使用 if 语句根据该测试来控制运行哪些命令。它也可以直接在提示符中键入——任何脚本都可以——但在这种情况下,这可能没有用。

以上两个完全都在 "Bash 内部",因为它们不需要 Bash 运行任何外部程序。(命令 echoif … then … else … fi[[ -e … ]] 都是内置命令,由 Bash 本身实现。)但是,作为一种 shell 脚本语言,Bash 的一大目的就是运行外部程序。以下脚本演示了这种能力

if [[ -e config.txt ]] ; then
  echo 'The file "config.txt" already exists. Comparing with default . . .'
  diff -u config-default.txt config.txt > config-diff.txt
  echo 'A diff has been written to "config-diff.txt".'
else
  echo 'The file "config.txt" does not exist. Copying default . . .'
  cp config-default.txt config.txt
  echo '. . . done.'
fi

这里 diffcp 是两个常见的实用程序,虽然不是 Bash 的一部分,但在大多数拥有 Bash 的系统上都能找到。上面的脚本假设存在一个名为 config-default.txt 的默认配置文件,并检查是否存在名为 config.txt 的配置文件。如果 config.txt 存在,则脚本使用外部程序 diff 来生成一个 "diff"(关于两个文件之间差异的报告,在本例中是两个文件),以便用户可以看到哪些非默认配置已到位。如果 config.txt 不存在,则脚本使用外部程序 cp ("copy") 将默认配置文件复制到 config.txt

如您所见,外部程序使用与内置命令相同的语法运行;它们都是 "命令"。

上面的脚本版本非常 "冗长",因为它产生了大量的输出。更典型的脚本可能不会包含 echo 命令,因为用户不太可能需要这种级别的信息。在这种情况下,我们可以使用 # 符号来包含对 Bash 完全忽略的注释,并且不会显示给用户。这些注释只是为了阅读脚本本身的人提供的信息。

if [[ -e config.txt ]] ; then
  # if config.txt exists:
  diff -u config-default.txt config.txt > config-diff.txt # see what's changed
else
  # if config.txt does not exist:
  cp config-default.txt config.txt # take the default
fi

但这只是为了演示的目的。在现实中,像这样简单的脚本根本不需要任何注释。

华夏公益教科书