第一章 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支持情况。
3.1 Shell脚本语言的优势
说了这么多,我们来说说shell脚本语言的优势所在吧。Shell脚本语言的优势在于处理偏操作系统底层的业务。列如:很多linux系统内部的应用都是shell脚本语言开发的。
对于一些常见的系统脚本,使用shell开发会更简单、更快捷。比如监控,自动化安装,优化等等。
3.2 常用操作系统默认的shell
Linux系统中主流的shell是bash,没有特殊的情况下,还是用bash。
通过以下两种方法可以查看Centos linux系统默认的shell
方法1:
方法2:
3.3 Shell脚本的建立和执行
3.3.1 Shell脚本的建立
在linux系统中,我们一般使用vim编辑器来编辑shell脚本,如下图:
1.脚本开头(第一行)
一个规范的shell脚本在第一行要指出是由哪个程序(解释器)来执行脚本中的内容,这一行内容在linux bash的编程一般为:
这样在执行脚本的时候,内核会根据#!后的解释器来确定该用哪个程序解释这个脚本中的内容。
注意:#!/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:这是脚本文件本身没有可执行权限的时候,或者脚本开头没有指定解释器的时候。
2)path/scripts-name或者./scripts-name:指在当前路径下执行脚本(脚本需要用执行权限)。
3)source scripts-name或者. scripts-name:这种方法是使用source或者.来执行脚本。而且这两个方法可以将一个shell脚本中的变量值或函数传递给当前父shell中使用。
4)sh<scripts-name或cat scripts-name|sh:同样适用于bash,不过这种方法并不多见,所以就不多做解释了。
3.3.3 Shell脚本开发的基本规范及习惯
1)shell脚本的第一行是指定脚本解释器
#!/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命令参数调试
[root@xujun1270 ~]# sh -nvx oldboy3.sh
主要选项说明:
-n 不会执行脚本,仅查询脚本语法是否有问题,并给出错误提示
-v 在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示
-x 将执行的脚本内容及输出显示到屏幕上
4.2 使用set命令调试脚本内容
主要选项说明:
-n 读命令但不执行
-v 显示读取的所有行
-x 显示所有命令及其参数
+x 关闭调试
4.3 Shell调试小结
1)如果是在windows下拿过来的脚本,要用dos2unix进行格式化
2)执行脚本根据报错来调试时,要知道有时所报错误会不准确,应多关联上下文查看
3)可通过sh -x命令调试整个脚本,且显示执行过程
4)set -x和set +x命令用于调试部分脚本呢的执行过程
5)可通过echo命令输出脚本中要确认的变量及相关内容,然后紧跟着使用exit退出,不执行后面程序,这种方式便于一步步跟踪脚本,对于逻辑错误的调试比较好用
6)最关键的还是语法熟练,养成良好的编程习惯,提高编程思想,将错误扼杀在摇篮之中,从而降低错误率,减轻调试的负担,提高开发效率。