|
|
|
|
移动端

2.6.1 Shell脚本的建立

《跟老男孩学Linux运维:Shell编程实战》本书是一本较完整的Shell编程实战型图书,并非大而全,但处处可以体现实战二字,大多内容取于企业实战,并结合老男孩十几年的运维工作和教学工作进行了梳理。本节为大家介绍Shell脚本的建立。

作者:老男孩来源:机械工业出版社|2017-04-20 18:28

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


2.6 Shell脚本的建立和执行

2.6.1 Shell脚本的建立

在Linux系统中,Shell脚本(bash Shell程序)通常是在编辑器vi/vim中编写的,由UNIX/Linux命令、bash Shell命令、程序结构控制语句和注释等内容组成。这里推荐用Linux自带的功能更强大的vim编辑器来编写,可以事先做一个别名alias vi='vim',并使其永久生效,这样以后习惯输入vi的读者也就可以直接调用vim编辑器了,设置方法如下:

  1. [root@oldboy ~]# echo "alias vi='vim'>>/etc/profile  
  2. [root@oldboy ~]# tail -1 /etc/profile  
  3. alias vi='vim' 
  4. [root@oldboy ~]# source /etc/profile 

1.脚本开头(第一行)

一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:

  1. #!/bin/bash  
  2. 或  
  3. #!/bin/sh #<==255个字符以内。 

其中,开头的“#!”字符又称为幻数(其实叫什么都无所谓,知道它的作用就好),在执行bash脚本的时候,内核会根据“#!”后的解释器来确定该用哪个程序解释这个脚本中的内容。

注意,这一行必须位于每个脚本顶端的第一行,如果不是第一行则为脚本注释行,例如下面的例子。

  1. [oldboy@oldboy ~]$ cat test.sh  
  2. #!/bin/bash  
  3. echo "oldboy start"  
  4. #!/bin/bash         #<==写到这里就是注释了。  
  5. #!/bin/sh               #<==写到这里就是注释了。  
  6. echo "oldboy end" 

2.bash与sh 的区别

早期的bash与sh稍有不同,它还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行,比如:

  1. [root@oldboy ~]# ll /bin/sh  
  2. lrwxrwxrwx. 1 root root 4 3月  19 20:54 /bin/sh -> bash  
  3. [root@oldboy ~]# ll /bin/bash  
  4. -rwxr-xr-x 1 root root 940416 10月 16 21:56 /bin/bash 

提示: sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。

下面的Shell脚本是系统自带的软件启动脚本的开头部分。

  1. [root@oldboy ~]# head -1 /etc/init.d/sshd  
  2. #!/bin/bash  
  3. [root@oldboy ~]# head -1 /etc/init.d/ntpd  
  4. #!/bin/bash  
  5. [root@oldboy ~]# head -1 /etc/init.d/crond  
  6. #!/bin/sh 

提示: 如果使用/bin/sh执行脚本出现异常,那么可以再使用/bin/bash试一试,但是一般不会发生此类情况。

一般情况下,在安装Linux系统时会自动安装好bash软件,查看系统的bash版本的命令如下。

  1. [root@oldboy ~]# cat /etc/redhat-release  
  2. CentOS release 6.8 (Final)  #<==这里显示的是作者写作的Linux的环境版本。  
  3. [root@oldboy ~]# bash --version  
  4. GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)  
  5.                     #<==这里显示的是bash的版本。  
  6. Copyright (C) 2009 Free Software Foundation, Inc.  
  7.                     #<==下面几行是自由软件提示的相关信息。  
  8. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
  9. This is free software; you are free to change and redistribute it.  
  10. There is NO WARRANTY, to the extent permitted by law. 

如果读者使用的是较老版本的Shell,那么建议将其升级到最新版本的Shell,特别是企业使用,因为近两年老版本的bash被暴露出存在较严重的安全漏洞。

例如:bash软件曾经爆出了严重漏洞(破壳漏洞),凭借此漏洞,攻击者可能会接管计算机的整个操作系统,得以访问各种系统内的机密信息,并对系统进行更改等。任何人的计算机系统,如果使用了bash软件,都需要立即打上补丁。检测系统是否存在漏洞的方法为:

  1. [root@oldboy ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"  
  2. this is a test 

如果返回如下两行,则表示需要尽快升级bash了,不过,仅仅是用于学习和测试就无所谓了。

  1. be careful  
  2. this is a test 

升级方法为:

  1. [root@oldboy ~]# yum -y update bash  
  2. [root@oldboy ~]# rpm -qa bash  
  3. bash-4.1.2-40.el6.x86_64 

提示: 如果没有输出be careful,则不需要升级。

下面是Linux中常用脚本开头的写法,不同语言的脚本在开头一般都要加上如下标识内容:

  1. 1 #!/bin/sh  
  2. 2 #!/bin/bash  
  3. 3 #!/usr/bin/awk  
  4. 4 #!/bin/sed  
  5. 5 #!/usr/bin/tcl  
  6. 6 #!/usr/bin/expect     #<==expect解决交互式的语言开头解释器。  
  7. 7 #!/usr/bin/perl       #<==perl语言解释器。  
  8. 8 #!/usr/bin/env python #<==python语言解释器。 

CentOS和Red Hat Linux下默认的Shell均为bash。因此,在写Shell脚本的时候,脚本的开头即使不加“#!/bin/bash”,它也会交给bash解释。如果写脚本不希望使用系统默认的Shell解释,那么就必须要指定解释器了,否则脚本文件执行后的结果可能就不是你所要的。建议读者养成好的编程习惯,不管采用什么脚本,最好都加上相应的开头解释器语言标识,遵守Shell编程规范。

如果在脚本开头的第一行不指定解释器,那么就要用对应的解释器来执行脚本,这样才能确保脚本正确执行。例如:

如果是Shell脚本,就用bash test.sh执行test.sh。

如果是Python脚本,就用python test.py执行test.py。

如果是expect脚本,就用expect test.exp执行test.exp。

提示: 其他的脚本程序大都是类似的执行方法。

3.脚本注释

在Shell脚本中,跟在#后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当作程序来执行,仅仅是给开发者和使用者看的,系统解释器是看不到的,更不会执行。注释可自成一行,也可以跟在脚本命令的后面与命令在同一行。开发脚本时,如果没有注释,那么团队里的其他人就会很难理解脚本对应内容的用途,而且若时间长了,自己也会忘记。因此,我们要尽量养成为所开发的Shell脚本书写关键注释的习惯,书写注释不光是为了方便别人,更是为了方便自己,避免影响团队的协作效率,以及给后来接手的人带来维护困难。特别提示一下,注释尽量不要用中文,在脚本中最好也不要有中文。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

高质量程序设计指南:C++/C语言(第3版)

本书以轻松幽默的笔调向读者论述了高质量软件开发方法与C++/C编程规范。它是作者多年从事软件开发工作的经验总结。本书共17章,第1章到第4...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊