01 Shell脚本编程入门知识
Linux Shell语言使用背景
目前全球正处于“互联网+”的时代,各行各业都与互联网挂钩,比如互联网+教育、互联网+销售等等。几乎所有的商品、服务网上都能找得到,而支撑互联网的幕后支柱就是Linux系统。Linux运维技术成为IT技术人员的必备技能。
想要降低Linux运维成本就要进行运维自动化,进行自动化就需要脚本语言。时下Linux系统最流行的脚本语言就是Shell和Python。Python的流行时间短,学习成本高。而Shell几乎是所有运维公司都必须使用的自动化语言,在很多工作环节中必不可少。
学习Shell编程最好有相关基础,比如vim编辑器、SSH终端、Linux命令(重点掌握正则表达式和grep、sed、awk命令)、Linux网络部署、日志分析排错、网络服务等。
常见网络服务类型:Crond、Rsync、Inotify、Nginx、PHP、MySQL、Keepalived、Memcached、Redis、NFS、Iptables、SVN、Git等。
其他脚本语言
PHP网页程序语言。Perl语言(已成为历史)。python。
Linux命令在Shell编程中的作用
每种语言都有自带的函数库,唯独Shell没有,Shell使用Linux命令,可以把Linux命令看作是Shell的函数库。
什么是Shell
定义:Shell是Linux/Unix命令解释器,负责将命令翻译给Linux系统内核并返回运算结果,是人机交互的中介接口。
Shell分类:命令行Shell(CLI Shell),图形化Shell(GUI Shell)。图形化Shell就是用鼠标点点点,有桌面界面的那种。命令行Shell类似于windows中的Dos。
命令行Shell分类:主要有两大类,B Shell系列和C Shell系列,B Shell用于Linux系统,C Shell用于Unix系统。
B Shell分类:包括Bourne Shell(sh)、Korn Shell(ksh)、Bourne Again Shell(bash)三种类型。重点掌握bash,它是各种Linux发行版系统默认的Shell,是目前主流Linux Shell。bash集合了ksh和sh的优点,而ksh是由sh发展出来的。
C Shell又包括csh、tcsh两种类型。tcsh是csh的增强版,已运用于苹果电脑MAC系统,但目前通用的还是csh。
一个系统可以储存了多个CLI Shell,CentOS 6查看系统有哪些Shell可以使用命令:cat /etc/shells
命令执行方式分类
交互式、批量式。(交互式就是一次只能输入一条命令,机器返回对应结果,再输入一条命令再返回一次结果。批量式就是一次写一整套脚本命令,然后机器一次性执行完。命令行Shell中使用Linux命令的执行方式就是交互式,而Shell脚本当然是使用批量式执行)
什么是Shell脚本
定义:Shell脚本是采用某种Linux Shell对应的命令以及操作语句编写的Linux系统批量操作程序。
(windows中用Dos解释器写的批量操作文件是.bat文件)
(Linux中用Shell解释器写的批量操作文件就是Shell脚本,后缀为.sh)
(所有编程语言都是由库函数和语句组成,而语句又由关键字和变量组成。至于表达式,不算在语言范畴中,比如1+2谁都能运行,属于哪门语言?)
Shell脚本内容:和其他计算机语言类似,Shell脚本语言包括两部分,Linux命令和控制语句。而控制语句又包括变量定义语句、赋值语句、输入/输出语句、分支语句、循环语句。
Shell脚本语言:是一种弱类型,解释型语言。
Shell脚本语言优势:与系统更兼容,命令多,适合处理偏系统底层业务。简单、易用、高效。
Shell脚本建立和执行
给vim编辑器起别名
编辑器有vi和vim,推荐使用vim。
在终端中给vim编辑器起个永久别名叫vi,分别输入以下两条命令:
echo "alias vi='vim'" >>/etc/profile
source /etc/profile
脚本的第一行
终端使用命令cat 路径可以编辑对应文件,添加单行代码。enter后自动保存。或者vi别名打开vim编辑器开始写脚本。
一般脚本的第一行是用来指定用哪个Shell来执行脚本的。选择输入下面任意一行代码指定使用哪个Shell。
#!/bin/bash
#!/bin/sh
#!/usr/bin/awk
#!/bin/sed
#!/usr/bin/tcl
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/env python
其中expect是交互式语言解释器,perl是perl语言解释器,env python是python解释器。
如果第一行不指定Shell,系统默认使用bash,为了规范,请指定Shell。
如果想让脚本在多种Shell上运行,第一行可以不指定Shell。运行时先进入对应的Shell,在Shell中打开脚本,这样也可以。
#!字符又称幻数,内核会读取#!后的路径选择Shell。
为什么一定要在第一行写?我们都知道#后面的内容是注释,第一行除外,所以幻数必须放在脚本顶端第一行,若上面代码放在其他行则无效,变成注释。
附:查看bash版本。终端输入:
bash --version
检测bash是否有漏洞。终端输入:
env x='() { :;}; echo be careful' bash -c "echo this is a test"
若显示be careful this is a test,则需要升级bash。升级方法是分别输入下面两条命令:
yum -y update bash
rpm -qa bash
若没有显示be careful,不需要升级bash。
执行脚本。
方法一(推荐方法):终端输入命令“Shell名 脚本名”,比如
bash script_name
使用这种方法不仅指定了Shell,也避免了脚本没有执行权限的问题。
方法二是终端输入命令“路径/脚本名或 ./脚本名”。路径可以是绝对路径或相对路径。
但这种方法执行的脚本必须要有执行权限。有的人定时运行脚本,结果脚本没有执行权限导致到时间没执行,造成重大损失。
给脚本添加执行权限使用命令:
chmod +x 脚本名
方法三是“source 脚本名” 或“. 脚本名”,点后要有空格。
source或点方法不同于其他方法。方法一、二(Shell和路径)运行脚本系统会开启一个新的Shell进程,执行完就关闭脚本文件,脚本数据不会留在原Shell进程上。
而使用source和点执行的脚本不会开启新的进程,直接在当前Shell终端进程中执行,执行完后关闭文件但不关闭当前Shell进程,数据依然存在于当前Shell中。
方法三与方法一、二不同的举例说明(#后是注释):
[root@andy ~]# cat test.sh #cat命令查看test文件,里面有条输出语句
echo "userdir=`pwd`"
[root@andy ~]# bash test.sh #使用“Shell 脚本”的格式执行脚本。
/home/root #执行成功,输出变量代表的pwd路径
[root@andy ~]# echo $userdir #此时已执行完毕,尝试再输出变量
#结果为空
[root@andy ~]# source test.sh #采用“source 脚本”的格式执行脚本
/home/root #执行成功
[root@andy ~]# echo $userdir #此时已执行完毕,尝试再输出变量
/home/root #再次显示变量内容
所以,记住source和 . 点方法执行脚本是在当前Shell中进行。执行完后变量都还在Shell中。
第四种方法是:“sh<脚本名” 或“cat 脚本名|sh”
这种方法不常用,这是个奇招,有时能少写几个循环,但不标准,不推荐。
系统执行脚本的过程是先查找环境变量ENV,然后ENV变量依次加载几个环境文件后,开始执行脚本。
执行顺序:从上到下,从左到右。若执行中遇到子脚本调用语句,则先执行完子脚本,再返回继续执行父脚本。
Shell脚本开发规范
第一行指定Shell。
脚本开头加版本、版权等信息。
尽量不使用中文。
脚本文件的后缀名是 .sh。
脚本文件保存在固定的路径下,如 /server/scripts。
书写技巧:
成对的符号先打出来再在里面添加内容。
流程控制语句先写完格式,再添加内容。
适当使用缩进使代码易读。
常规字符串用双引号,强引用用单引号,引用命令用反引号。