初识脚本编程
到目前为止我们已经知道了 Linux 系统和命令行的基础知识,是时候开始编程了。本章讨论编写 shell 脚本的基础知识。在开始编写自己的 shell 脚本大作前,你必须了解这些基本概念。
使用多个命令
到目前为止,你已经了解了如何使用 shell 的命令行界面提示符来输入命令和查看命令的结果。shell 脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令。shell 可以让你将多个命令串起来,一次执行完成。如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开。
$ date ; who Sun Dec 20 08:59:29 AM CST 2020 testuser tty1 2020-12-20 08:11 (:0) testuser pts/0 2020-12-20 08:11 (:0) testuser pts/1 2020-12-20 08:59 (:0) $恭喜,你刚刚已经写好了一个脚本。这个简单的脚本只用到了两个 bash shell 命令。date 命令先运行,显示了当前日期和时间,后面紧跟着 who 命令的输出,显示当前是谁登录到了系统上。使用这种办法就能将任意多个命令串连在一起使用了,只要不超过最大命令行字符数 255 就行。
这种技术对于小型脚本尚可,但它有一个很大的缺陷:每次运行之前,你都必须在命令提示符下输入整个命令。可以将这些命令组合成一个简单的文本文件,这样就不需要在命令行中手动输入了。在需要运行这些命令时,只用运行这个文本文件就行了。
创建 shell 脚本文件
要将 shell 命令放到文本文件中,首先需要用文本编辑器来创建一个文件,然后将命令输入到文件中。在创建 shell 脚本文件时,必须在文件的第一行指定要使用的 shell。其格式为:
#!/bin/bash在通常的 shell 脚本中,井号(#)用作注释行。shell 并不会处理 shell 脚本中的注释行。然而,shell 脚本文件的第一行是个例外,#后面的惊叹号会告诉 shell 用哪个 shell 来运行脚本(是的,你可以使用 bash shell,同时还可以使用另一个 shell 来运行你的脚本)。
在指定了 shell 之后,就可以在文件的每一行中输入命令,然后加一个回车符。之前提到过,注释可用#添加。例如:
# This script displays the date and who's logged on date who这就是脚本的所有内容了。可以根据需要,使用分号将两个命令放在一行上,但在 shell 脚本中,你可以在独立的行中书写命令。shell 会按根据命令在文件中出现的顺序进行处理。
还有,要注意另有一行也以#开头,并添加了一个注释。shell 不会解释以#开头的行(除了以#!开头的第一行)。留下注释来说明脚本做了什么,这种方法非常好。当两年后回过来再看这个脚本时,你还可以很容易回忆起做过什么。
将这个脚本保存在名为 test1 的文件中,基本就好了。在运行新脚本前,还要做其他一些事。现在运行脚本,结果可能会叫你有点失望。
$ test1 bash: test1: command not found你要跨过的第一个障碍是让 bash shell 能找到你的脚本文件。如之前所述,shell 会通过 PATH 环境变量来查找命令。快速查看一下 PATH 环境变量就可以弄清问题所在。
$ echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin :/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user/binPATH 环境变量被设置成只在一组目录中查找命令。要让 shell 找到 test1 脚本,只需采取以下两种作法之一:
- 将 shell 脚本文件所处的目录添加到 PATH 环境变量中;
- 在提示符中用绝对或相对文件路径来引用 shell 脚本文件。
有些 Linux 发行版将$HOME/bin 目录添加进了 PATH 环境变量。它在每个用户的 HOME 目录下提供了一个存放文件的地方,shell 可以在那里查找要执行的命令。
在这个例子中,我们将用第二种方式将脚本文件的确切位置告诉 shell。记住,为了引用当前目录下的文件,可以在 shell 中使用单点操作符。
$ ./test1 bash: ./test1: Permission denied现在 shell 找到了脚本文件,但还有一个问题。shell 指明了你还没有执行文件的权限。快速查看一下文件权限就能找到问题所在。
$ ls -l test1 -rw-rw-r-- 1 user user 73 Sep 24 19:56 test1在创建 test1 文件时,umask 的值决定了新文件的默认权限设置。由于 umask 变量在 ArchLinux 中被设成了 022,所以系统创建的文件的文件属主只有读/写权限。
下一步是通过 chmod 命令赋予文件属主执行文件的权限。
$ chmod u+x test1 $ ./test1 Sun Dec 20 08:59:29 AM CST 2020 testuser tty1 2020-12-20 08:11 (:0) testuser pts/0 2020-12-20 08:11 (:0) testuser pts/1 2020-12-20 08:59 (:0)成功了!
显示消息
大多数 shell 命令都会产生自己的输出,这些输出会显示在脚本所运行的控制台显示器上。很多时候,你可能想要添加自己的文本消息来告诉脚本用户脚本正在做什么。可以通过 echo 命令来实现这一点。如果在 echo 命令后面加上了一个字符串,该命令就能显示出这个文本字符串。
$ echo This is a test This is a test注意,默认情况下,不需要使用引号将要显示的文本字符串划定出来。但有时在字符串中出现引号的话就比较麻烦了。
$ echo Let's see if this'll work Lets see if thisll workecho 命令可用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,你需要在文本中使用其中一种引号,而用另外一种来将字符串划定起来。
$ echo "This is a test to see if you'