Shell 脚本是一系列您重复使用的命令。此序列通常通过在命令行中输入脚本名称来执行。或者,您可以使用脚本通过 cron 工具自动化任务。脚本的另一个用途是在 UNIX 启动和关闭过程中,守护进程和服务的操作在 init 脚本中定义。
要创建 shell 脚本,请在您的编辑器中打开一个新的空文件。任何文本编辑器都可以:vim、emacs、gedit、dtpad 等都是有效的。 但是,您可能需要选择更高级的编辑器,如 vim 或 emacs,因为这些编辑器可以配置为识别 shell 和 Bash 语法,并且可以极大地帮助防止初学者经常犯的错误,例如忘记括号和分号。
![]() | vim 中的语法高亮 |
---|---|
为了在 vim 中激活语法高亮,请使用命令 :syntax enable 或者 :sy enable 或者 :syn enable 您可以将此设置添加到您的.vimrc文件使其永久生效。 |
将 UNIX 命令放入新的空文件中,就像您在命令行中输入它们一样。正如上一章中讨论的那样(参见 第 1.3 节),命令可以是 shell 函数、shell 内置命令、UNIX 命令和其他脚本。
给您的脚本起一个有意义的名称,以便提示脚本的功能。确保您的脚本名称不与现有命令冲突。为了确保不会引起混淆,脚本名称通常以.sh;即便如此,您的系统上可能还存在其他与您选择的名称相同的脚本。使用 which、whereis 和其他命令检查以查找有关程序和文件的信息
which-a script_name
whereisscript_name
locatescript_name
在这个例子中,我们使用 echo Bash 内置命令来告知用户即将发生的事情,在执行将创建输出的任务之前。强烈建议告知用户脚本正在做什么,以防止他们因为脚本没有做任何事情而感到紧张。我们将在 第 8 章 中回到通知用户的主题。
也为您自己编写这个脚本。创建一个目录可能是一个好主意~/scripts来存放您的脚本。将该目录添加到PATH变量
exportPATH="$PATH:~/scripts"
如果您刚开始使用 Bash,请使用一个文本编辑器,该编辑器对不同的 shell 结构使用不同的颜色。 vim、gvim、(x)emacs、kwrite 和许多其他编辑器都支持语法高亮;请查看您喜欢的编辑器的文档。
![]() | 不同的提示符 |
---|---|
本课程中使用的提示符根据作者的心情而有所不同。这比标准的教育性 $ 提示符更贴近实际情况。我们唯一坚持的约定是 root 提示符以井号 (#) 结尾。 |
脚本应该对正确的所有者具有执行权限才能运行。设置权限时,请检查您是否真的获得了您想要的权限。完成此操作后,脚本可以像任何其他命令一样运行
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
![]() | source = . |
---|---|
Bash source 内置命令是 Bourne shell . (点) 命令的同义词。 |
在这种情况下,脚本不需要执行权限。命令在当前 shell 上下文中执行,因此当脚本完成执行时,对您的环境所做的任何更改都将可见
willy:~/scripts> source script1.sh --output ommitted-- willy:~/scripts> echo $VALUE 9 willy:~/scripts> |