Bash Shell 脚本/入门练习
我们将看几个例子,以了解 Bash 脚本可以用于什么。如果您现在还不理解,请不要担心。
让我们从一个简单的 "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 运行任何外部程序。(命令 echo
、if … 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
这里 diff
和 cp
是两个常见的实用程序,虽然不是 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
但这只是为了演示的目的。在现实中,像这样简单的脚本根本不需要任何注释。