Linux编撰并执行Shell脚本在学习了Shell环境中的变量操作,熟练把握这种知识,将有助于编撰出高效率的Shell管理脚本程序。本文将学习怎么编撰并执行简单的Shell脚本。1.1Shell脚本的概念BashShell程序除了可以作为用户管理Linux系统的命令操作环境,同时也可以作为一种优秀的脚本程序语言。但凡使用Shell编程语言编撰的程序文件都可以称为Shell脚本。浅显一点说,只要将一些Linux命令行按次序保存到一个文本文件中,并赋于这个文件可执行权限,这个文件就可以称为Shell脚本。其实,Shell脚本是为了完成一定的管理任务才创建的,因而脚本文件中的各条命令并不是零乱无章随意放置的linux 执行shell脚本,这就须要用户进行组织和设计了。与编译型的中级编程语言(如C++、Java等)不同,Shell脚本程序是属于解释执行的linux rar,并不须要非常进行编译,而只须要有相应的Shell命令类库即可。常年以来Shell脚本在Linux(UNIX)系统中得到了广泛的使用,并承当着重要的角色。Linux系统中存在有大量的Shell脚本文件,好多脚本程序是Linux系统中不可缺乏的组成部份,功能十分重要。比如,在“/etc/init”目录中存在着数目相当多的系统服务启动程序,这种程序全都是Shell脚本文件,可以使用file命令查看那些文件的类型。
确认系统服务脚本文件的数目和文件类型。[root@localhost87[root@localhostfile/etc/rc.d/init.d/*tail-2/etc/rc.d/init.d/ypbind:Bourne-AgainShellscripttextexecutable/etc/rc.d/init.d/yum-updatesd:Bourne-AgainShellscripttextexecutableLinux中的系统脚本文件的属主都是管理员用户root,所有的脚本文件都具有可执行(x)的文件属性,因而可以由Shell解释执行。Shell脚本文件以文本文件的方式保存,可以使用cat命令查看文件内容,也可以使用vi编辑器更改文件的内容。查看系统中网路服务脚本network文件开头五行的内容。cat/etc/rc.d/init.d/networkhead-5networkBringup/downnetworkingchkconfig:23451090Linux中的系统脚本文件只有管理员root才具有更改权限,更改系统服务脚本存在相当大的风险,错误的改动有可能造成系统程序的截瘫,因而不建议初学者直接更改系统服务脚本。
1.2编撰Shell脚本文件编撰一个完整可运行的Shell脚本须要经过两个步骤。1.构建包含可执行句子的文本文件使用文本编辑器程序(如vi)创建脚本文件,文件名中可以使用扩充名(如“.sh”),也可以不使用扩充名,并没有强制的要求。脚本中可能包括的内容如下。运行环境设置:一般坐落文件的第一行内容,用于指定使用哪一个Shell程序进行解释。设置开始,前面紧注释行:在脚本文件中,不仅以“#!”开头的Shell环境设置行以外,其他以“#”符号开头的内容将被视为注释信息,执行脚本时将给以忽视。编撰脚本程序时,添加必要的注释句子是一个良好的习惯,这将大大提高脚本文件的易读性,便捷在不同时间、不同用户间交流使用。可执行句子:可执行句子是Shell脚本程序中最重要的组成部份linux apache 虚拟主机,在命令行操作界面中可以执行的命令都可以写入到脚本中,程序运行时默认将会依照次序依次解释执行。除此以外,还可以添加一些程序结构句子,用于灵活控制执行过程,提升程序执行效率(将在后面章节小学习)。在上述各组成部份中,只有可执行句子是必不可少的(否则就不叫程序了),当缺省运行环境设置时,会手动由当前加载该脚本的Shell类库负责解释执行。
虽然这么,还是建议明晰指定Shell环境,以保持脚本程序的完整性和可移植性。使用vi编辑器编撰一个简单的Shell脚本文件repboot.sh,用于报告当前系统中“/boot”目录所占用的空间大小,并列举其中内核文件的属性信息。virepboot.sh//编撰的内容如下#!/bin/bashshowusage/bootdirectorykernelfile.echo"Useagedu-sh/bootechokernelfile:"ls-lh/boot/vmlinuz-*在上述脚本文件中,依次设置了四条可执行命令,两条echo句子用于显示相应的提示信息,而du、ls命令分别用于完成查看目录空间、显示文件属性的任务。2.为脚本添加可执行权限编撰并保存好脚本文件之后,须要执行该程序能够看见操作结果。并且刚才构建的脚本文件一般不具有可执行属性,因而还得使用chmod命令为文件添加“x”权限。为上一步编撰的脚本文件repboot.sh添加可执行权限。[root@localhostrepboot.sh-rw-r--r--rootroot16605-2015:37repboot.sh[root@localhostrepboot.sh[root@localhostrepboot.sh-rwxr-xr-xrootroot16605-2015:37repboot.sh将脚本文件设置了可执行属性后,就可以通过执行脚本文件来验证程序的正确性了。
1.3执行Shell脚本Shell命令行环境中可以用多种方法执行Shell脚本,下边分别进行介绍。1.直接执行带“x”权限的脚本文件为脚本文件设置可执行属性后,在Shell命令行中可以直接通过脚本文件的路径执行脚本程序,这也是最常用的一种方法。执行当前目录下的repboot.sh脚本程序文件。[root@localhost./repboot.shUseage/boot:5.2M/bootkernelfile:rootroot1.7M2007-01-27/boot/vmlinuz-2.6.18-8.el5因为脚本文件储存在当前目录中,而不是储存在用户的命令搜索路径中,因而执行脚本文件时,须要在文件名之前加入“./”路径,明晰强调须要执行当前目录下的脚本文件,这些方式也是出于对系统安全性的考虑。2.使用Shell类库程序执行脚本这些方法可以将脚本文件作为指定Shell类库程序(如bash、sh等)的参数,由类库程序负责读取脚本文件中的内容并执行,因而并不须要脚本文件具有可执行的属性。此方式一般只在脚本的调试阶段使用。使用bash类库程序自动加载执行repboot.sh脚本文件中的句子。
[root@localhostbashrepboot.shUseage/boot:5.2M/bootkernelfile:-rw-r--r--rootroot1.7M2007-01-27/boot/vmlinuz-2.6.18-8.el53.使用“.”命令执行脚本在使用Shell类库程序(如bash)执行指定脚本文件的方式时,是在当前Shell启动一个子Shell来运行脚本程序,因而脚本程序中定义的环境变量只能在子Shell环境中使用,而未能在用户当前的Shell环境中使用。使用Bash的内部命令“.”(或使用source命令,作用相同)加载指定的脚本文件执行时,将不会开启新的Shell环境。使用这些方法时,脚本文件作为“.”命令的参数,因此同样不要求具备“x”权限。比如,在更改完“/etprofile”文件之后,可以执行“./etc/profile”命令,致使在文件中新设置的变量立刻生效,而无需重新登入。使用“.”命令读取repboot.s脚本文件中的可执行句子,在当前Shell环境中运repboot.shUseage/boot:5.2M/bootkernelfile:-rw-r--r--rootroot1.7M2007-01-27/boot/vmlinuz-2.6.18-8.el5须要在脚本文件中调用其他脚本文件时,一般会使用“.”命令,所调用的脚本文件执行完毕后将返回原先的脚本程序继续执行。
1.4正则表达式正则表达式(RegularExpression)就是用一个“字符串”来描述一个特点,之后去验证另一个“字符串”是否符合这个特点,以进行查找、替换或删掉操作。简单地说linux 执行shell脚本,正则表达式就是用在字符串处理上的一项“表达式”。它不是一个工具,而是一个字符串处理的标准。假如想要以正则表达式的形式处理字符串,就要使用支持正则表达式的工具,比如vi、grep、sed、awk1.4.1正则表达式的基本元字符集所谓元字符就是指这些在正则表达式中具有特殊意义的专用字符,可以拿来规定位于其后面的字符在目标对象中的出现模式。表1.1给出了常用的元字符及其涵义。须要注意的是,这种元字符并不是在所有的Linux工具中都可以使用,至于某个应用程序支持什么元字符,可以参照该工具的用户指南。1.1常用的元字符及其涵义元字符涵义示例匹配结果行首定位符/^btest匹配所有以btest开头的行btest匹配所有以btest结尾的行