2.1. 创建和运行脚本

2.1.1. 编写和命名

Shell 脚本是一系列您重复使用的命令。此序列通常通过在命令行中输入脚本名称来执行。或者,您可以使用脚本通过 cron 工具自动化任务。脚本的另一个用途是在 UNIX 启动和关闭过程中,守护进程和服务的操作在 init 脚本中定义。

要创建 shell 脚本,请在您的编辑器中打开一个新的空文件。任何文本编辑器都可以:vimemacsgeditdtpad 等都是有效的。 但是,您可能需要选择更高级的编辑器,如 vimemacs,因为这些编辑器可以配置为识别 shell 和 Bash 语法,并且可以极大地帮助防止初学者经常犯的错误,例如忘记括号和分号。

Tipvim 中的语法高亮
 

为了在 vim 中激活语法高亮,请使用命令

:syntax enable

或者

:sy enable

或者

:syn enable

您可以将此设置添加到您的.vimrc文件使其永久生效。

将 UNIX 命令放入新的空文件中,就像您在命令行中输入它们一样。正如上一章中讨论的那样(参见 第 1.3 节),命令可以是 shell 函数、shell 内置命令、UNIX 命令和其他脚本。

给您的脚本起一个有意义的名称,以便提示脚本的功能。确保您的脚本名称不与现有命令冲突。为了确保不会引起混淆,脚本名称通常以.sh;即便如此,您的系统上可能还存在其他与您选择的名称相同的脚本。使用 whichwhereis 和其他命令检查以查找有关程序和文件的信息

which-a script_name

whereisscript_name

locatescript_name

2.1.2. script1.sh

在这个例子中,我们使用 echo Bash 内置命令来告知用户即将发生的事情,在执行将创建输出的任务之前。强烈建议告知用户脚本正在做什么,以防止他们因为脚本没有做任何事情而感到紧张。我们将在 第 8 章 中回到通知用户的主题。

图 2-1. script1.sh

也为您自己编写这个脚本。创建一个目录可能是一个好主意~/scripts来存放您的脚本。将该目录添加到PATH变量

exportPATH="$PATH:~/scripts"

如果您刚开始使用 Bash,请使用一个文本编辑器,该编辑器对不同的 shell 结构使用不同的颜色。 vimgvim(x)emacskwrite 和许多其他编辑器都支持语法高亮;请查看您喜欢的编辑器的文档。

Note不同的提示符
 

本课程中使用的提示符根据作者的心情而有所不同。这比标准的教育性 $ 提示符更贴近实际情况。我们唯一坚持的约定是 root 提示符以井号 (#) 结尾。

2.1.3. 执行脚本

脚本应该对正确的所有者具有执行权限才能运行。设置权限时,请检查您是否真的获得了您想要的权限。完成此操作后,脚本可以像任何其他命令一样运行

willy:~/scripts> chmod u+x script1.sh

willy:~/scripts> ls -l script1.sh
-rwxrw-r--    1 willy	willy		456 Dec 24 17:11 script1.sh

willy:~> script1.sh
The script starts now.
Hi, willy!

I will now fetch you a list of connected users:

  3:38pm  up 18 days,  5:37,  4 users,  load average: 0.12, 0.22, 0.15
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     tty2     -                Sat 2pm  4:25m  0.24s  0.05s  -bash
willy	 :0       -                Sat 2pm   ?     0.00s   ?     -
willy    pts/3    -                Sat 2pm  3:33m 36.39s 36.39s  BitchX willy ir
willy    pts/2    -                Sat 2pm  3:33m  0.13s  0.06s  /usr/bin/screen

I'm setting two variables now.
This is a string: black
And this is a number: 9

I'm giving you back your prompt now.

willy:~/scripts> echo $COLOUR

willy:~/scripts> echo $VALUE

willy:~/scripts>

这是执行脚本最常见的方式。 最好在子 shell 中像这样执行脚本。在此子 shell 中创建的变量、函数和别名仅对该子 shell 的特定 bash 会话已知。当该 shell 退出并且父 shell 重新获得控制权时,所有内容都会被清理干净,并且脚本对 shell 状态所做的所有更改都会被遗忘。

如果您没有将scripts目录放在您的PATH,并且.(当前目录)不在PATH中,您可以使用如下方式激活脚本

./script_name.sh

脚本也可以由给定的 shell 显式执行,但通常我们只在想要获得特殊行为时才这样做,例如检查脚本是否适用于另一个 shell 或打印跟踪信息以进行调试

rbashscript_name.sh

shscript_name.sh

bash-x script_name.sh

指定的 shell 将作为当前 shell 的子 shell 启动并执行脚本。 当您希望脚本在脚本中未指定的特定选项或特定条件下启动时,可以这样做。

如果您不想启动新的 shell,而是在当前 shell 中执行脚本,您可以source

sourcescript_name.sh

Tipsource = .
 

Bash source 内置命令是 Bourne shell . (点) 命令的同义词。

在这种情况下,脚本不需要执行权限。命令在当前 shell 上下文中执行,因此当脚本完成执行时,对您的环境所做的任何更改都将可见

willy:~/scripts> source script1.sh
--output ommitted--

willy:~/scripts> echo $VALUE
9

willy:~/scripts>