第一章 Shell脚本初步入门

1 什么是shell

Shell就是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户每输入一条命令,shell就要解释执行一条。

Shell存在于操作系统的最外层,负责与用户的直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,然后在输出到屏幕上给用户。

2 什么是shell脚本

那么什么是shell脚本呢?之前我们已经对shell做出了解释,在理解shell脚本就容易多了。当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为shell脚本。

3 Shell脚本语言的种类

Shell脚本语言是弱类型语言(无须定义变量的类型即可使用)。在unix/linux中主要有两大类shell:一类是Bourne shell,另一类是C shell。

1)Bourne shell

Bourne shell主要包括Bourne shell(sh)、Korn shell(ksh)、Bourne Again shell(bash)三种类型

  • Bourne shell(sh)是标准的UNIX shell,很多unix系统都配有sh。
  • Korn shell(ksh)是Bourne shell(sh)的超集合,并且添加了csh引入的新功能,是目前很多unix系统标准配置的shell,这些系统上的/bin/sh往往是指向/bin/ksh的符号链接。
  • Bourne Again shell(bash)是各种linux发行版默认配置的shell,linux系统上的/bin/sh往往是指向/bin/bash的符号链接。尽管如此,bash和sh还是有很多不同的地方:一方面,bash扩展了一些命令和参数。另一方面,bash并不完全和sh兼容,它们有一些行为并不一致。但是大多数企业中区别不大,特殊场景可以使用bash替代sh。

2)C shell

C shell它很像C语言,支持很多Bourne shell(sh)所不支持的功能,列如:作业控制、别名、系统算术、命令历史等等。

3)以上介绍的这些shell中,较为常用的是Bourne shell(sh)、Bourne Again shell(bash)、C shell。

通过以下命令可以查看当前版本的shell支持情况。

image.png

3.1 Shell脚本语言的优势

说了这么多,我们来说说shell脚本语言的优势所在吧。Shell脚本语言的优势在于处理偏操作系统底层的业务。列如:很多linux系统内部的应用都是shell脚本语言开发的。

对于一些常见的系统脚本,使用shell开发会更简单、更快捷。比如监控,自动化安装,优化等等。

3.2 常用操作系统默认的shell

Linux系统中主流的shell是bash,没有特殊的情况下,还是用bash。

通过以下两种方法可以查看Centos linux系统默认的shell

方法1:

image.png

方法2:

image.png

3.3 Shell脚本的建立和执行

3.3.1 Shell脚本的建立

在linux系统中,我们一般使用vim编辑器来编辑shell脚本,如下图:

image.png

1.脚本开头(第一行)

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

wpsBFD8.tmp.jpg

这样在执行脚本的时候,内核会根据#!后的解释器来确定该用哪个程序解释这个脚本中的内容。

注意:#!/bin/bash这一行必须位于每个脚本的顶端,如果不是第一行则为脚本注释行

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

还有就是在Centos和Red hat中默认的shell均为bash。所以,假如你写shell脚本的时候,脚本的开头即使不加“#!/bin/bash”,它也会交给bash解释。

2.脚本的注释

在shell脚本中,跟在#后面的内容就是注释,注释部分是不会被计算机识别的,仅仅是用来给开发者和使用者看的。特别提示一下,注释尽量别用中文,在脚本中最好也不要用中文。

3.3.2 Shell脚本的执行

如何在linux系统上执行shell脚本呢?可以采用以下几种方式:

1)bash scripts-name或者sh scripts-name:这是脚本文件本身没有可执行权限的时候,或者脚本开头没有指定解释器的时候。

wpsE397.tmp.jpg
wpsE398.tmp.jpg
wpsE399.tmp.jpg

2)path/scripts-name或者./scripts-name:指在当前路径下执行脚本(脚本需要用执行权限)。

wpsE3AA.tmp.jpg

3)source scripts-name或者. scripts-name:这种方法是使用source或者.来执行脚本。而且这两个方法可以将一个shell脚本中的变量值或函数传递给当前父shell中使用。

wpsE3AB.tmp.jpg

4)sh<scripts-name或cat scripts-name|sh:同样适用于bash,不过这种方法并不多见,所以就不多做解释了。

wpsE3BC.tmp.jpg

3.3.3 Shell脚本开发的基本规范及习惯

1)shell脚本的第一行是指定脚本解释器

  1. #!/bin/bash

2)shell脚本的开头最好加版本、版权信息等

3)在shell脚本中尽量不要使用中文(不限于注释)

4)Shell脚本的命令应以.sh为扩展名

5)Shell脚本应存放在固定的路径下

6)还有就是符号要规范,要工整、排版要好

7)不要以当前系统的环境变量命名

3.4 防止客户端执行脚本中断的方法

1)sh while_01.sh &

2)nohup while_01.sh

3)screen 保持会话

4 Shell脚本调试

4.1 使用bash命令参数调试

  1. [root@xujun1270 ~]# sh -nvx oldboy3.sh
  2. 主要选项说明:
  3. -n 不会执行脚本,仅查询脚本语法是否有问题,并给出错误提示
  4. -v 在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示
  5. -x 将执行的脚本内容及输出显示到屏幕上

4.2 使用set命令调试脚本内容

  1. 主要选项说明:
  2. -n 读命令但不执行
  3. -v 显示读取的所有行
  4. -x 显示所有命令及其参数
  5. +x 关闭调试

4.3 Shell调试小结

1)如果是在windows下拿过来的脚本,要用dos2unix进行格式化

2)执行脚本根据报错来调试时,要知道有时所报错误会不准确,应多关联上下文查看

3)可通过sh -x命令调试整个脚本,且显示执行过程

4)set -x和set +x命令用于调试部分脚本呢的执行过程

5)可通过echo命令输出脚本中要确认的变量及相关内容,然后紧跟着使用exit退出,不执行后面程序,这种方式便于一步步跟踪脚本,对于逻辑错误的调试比较好用

6)最关键的还是语法熟练,养成良好的编程习惯,提高编程思想,将错误扼杀在摇篮之中,从而降低错误率,减轻调试的负担,提高开发效率。