第二十二章 Shell脚本入门
Shell脚本就是包含一系列命令的文件。Shell读取该文件并执行其中的命令,Shell的独特之处在于它即使系统强大的命令接口,又是脚本语言解释器。
创建并执行Shell脚本
创建并执行脚本,要做到3件事:
- 编写脚本。
- 将脚本设置为可执行。
- 把脚本放在Shell能够找到的地方。
脚本文件格式
沿袭传统,写编写一个“Hello World”的脚本。打开文本编辑器,输入下列脚本:
#!/bin/bash
# 这是我的第一个Shell脚本
echo ‘Hello World!’
脚本的第一行表明这是一个bash脚本,第二行是一个注释,第三行通过echo命令打印Hello World。
在Shell脚本中,注释可以出现在代码行尾,只要之前至少有一个空白字符即可,例如:
echo ‘Hello World!’ # 这也是注释
代码行内的#之后的内容都是注释,同样也适用于命令行。
echo "Hello World!" # 这也是注释
输出结果如下:
Hello World!
脚本的第一行开头的字符序列#!是一种名为shebag的特殊构件。shebang用于告知内和该使用那个解释器执行接下来的脚本。所有的Shell脚本都应该将其作为第一行。
可执行权限
shell脚本文件默认没有执行权限,不能使用,需要增加执行权限。使用chmod命令来实现。
chmod 755 hello_world.sh #设置hello_world.sh的权限码为755ls -l hello_world.sh #列出hello_world.sh的长格式信息
命令输出如下:
脚本位置
设置好权限就可以执行脚本了。
要想执行脚本,必须在脚本名称之前指定路径。如果不这么做,会得到如下结果:
因为脚本所在的位置,没有保存在PATH环境变量中。PATH的值是以冒号分隔的目录列表,可以查看PATH的内容:
echo $PATH
PATH内容如下图:
可以看到多个目录,如果脚本位于其中任何一个目录就可以直接通过文件名执行。大多数Linux发行版会在PATH变量中加入用户主目录下的bin目录,以便用户执行自己程序。如果创建了bin目录并将脚本置于其中,它就能其他程序一样直接执行了。
如果PATH变量没有包含该目录,可以自己手动添加,把下面这行加入.bashrc文件中即可:
export PATH=~/bin:“$PATH”
改动会在每个新的终端会话中生效。要想将改动应用于当前终端会话,必须让Shell重新读取.bashrc文件。可以通过sourcing操作实现。
. .bashrc
点好命令是source命令的同义词,该内建命令读取指定Shell命令文件,将其中的命令视为直接从键盘输入的命令。
注意: 对于Ubuntu(还有多数基于debian的操作系统),在执行用户的.bashrc文件时,如果/bin目录已存在,则自动将其添加到PATH变量中。在Ubuntu中创建好/bin目录,然后注销,再重新登录,一切就当妥当了。
脚本的理想位置
~/bin目录是一个存放个人脚本的理性位置。如果编写了一个系统所有用户都可以使用的脚本,呢吗这类脚本的传统存放位置是/usr/local/bin。超级用户使用的脚本通常放置在/usr/local/sbin。在大多数情况下,本地提供的软件,无论是脚本或者是编译好的程序,都应该放置在/usr/local中,而非/bin或/usr/bin中。这些目录都是由Linux文件系统层次结构标准规定的,只能包含由Linux发行商提供和维护的文件。
更多的格式技巧
编写脚本要考虑的脚本的可维护性,让脚本易读易理解是增强其可维护性的一种方法。
长选项
很多命令都支持短选项和长选项。例如,ls命令的众多选项,即可用短选项表示,也可以用长选项表示:
ls -ad
等价于:
ls --all --directory
为了减少输入,在命令行上输入时采用短选项,在编写脚本时,长选项可以增强可读性。
缩进与续行
当使用冗长的命令时,可以将命令分散写成多行,以此增强可读性。以find命令作为示例。
find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -or \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';' \)
显然该命令,不易看出其含义。在脚本中,将其改写成下面这种形式,会更容易理解:
find playground \\( \-type f \-not -perm 0600 \-exec chmod 0600 '{}' ';' \\) \-or \\( \-type d \-not -perm 0700 \-exec chmod 0700 '{}' ';' \\) \
利用续行和缩进,能够更清晰地描述这个复杂命令背后的逻辑。该技术也适用于命令行,不过很少用到,因其不便于输入和编辑。脚本和命令的一个区别是,脚本可以使用制表符来实现缩进,而命令行却无法实现,因为按Tab键会激活自动补齐功能。
脚本编写用到的Vim配置功能
启用语法高亮:
:syntax on
启用查找结果高亮:
:set hlsearch
设置制表符占用的列数:
:set tabstop=4
默认值是8,将列数设置为4(这是一种常见的做法)便于较长的行适应屏幕。
启用“自动缩进”特征:
:set autoindent
这个选项会使Vim在缩进新行的时候与上一行保持一致。这能够加快很多编程构建的输入速度。按Ctrl-D组合键可以停止缩进。
将这些命令(不包括开头的冒号)加入你的~/.vimrc文件,就能使改动永久有效。