人人都能学会的SHELL编程目录1.Shell入门简介......................................22.Shell编程之变量详解................................53.If条件语句学习.....................................84.使用if条件语句编写MySQL备份脚本.................115.IF条件综合Shell实战脚本编写......................126.循环语句for......................................207.循环语句while.....................................228.Until循环语句.....................................239.Case选择语句......................................2410.select选择语句....................................2511.Shell编程函数讲解.................................2512.Shell数组编程.....................................2713.Shell编程之awk、sed命令案例分析..................3014.全备和增量备份Linux系统脚本编写..................3115.Shell编程之IP匹配及磁盘邮件告警...错误!未定义书签。1.Shell入门简介说到Shell编程,我想很多从事Linux运维工作的朋友都不陌生,都对Shell有基本的了解,可能大家刚开始接触Shell的时候,有各种想法?能不能不学?高大上?到底是浮云?还是神马?很难啊?我想告诉大家的是,大家有这些想法一点都不觉得惊讶,为什么?这些都很正常,对于任何一件事情在未开始之前,肯定会有总总假设,那我今天想说的是,学完人人都会Shell编程后,我们会觉得一切的Shell都是浮云,我们每个人都能很好的使用它,驾驭它,更好的完成我们日常运维的工作。曾经有人说过,玩Linux不知道Shell,那就是不懂Linux;现在细细品味确实是这样。为了让更多的人能接触Shell、了解Shell,使用Shell,所以今天开设了这样一个网络课程,让我们的Shell飞起来。好的,其他不多说了,我们正式进入主题,什么是Shell呢?Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用Shell脚本编程去运行。LinuxShell种类非常多,常见的有:BourneShell(/usr/bin/sh或/bin/sh)、BourneAgainShell(/bin/bash)、CShell(/usr/bin/csh)、KShell(/usr/bin/ksh)、ShellforRoot(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。最常用的shell是Bash,也就是BourneAgainShell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。接下来我们来写一个简单的shell脚本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)vifirst_shell.sh#!/bin/bash#ThisismyFirstshellecho“HelloWorld!”这就是我们的第一个脚本,是不是很简单呢,注解如下:#!/bin/bash//表示定义该脚本是一个shell脚本(固定格式)。#ThisismyFirstshell//这里的#号属于注解,没有任何的意义,SHELL不会解析它。echo“HelloWorld!”//shell脚本主命令,我们执行这个脚本讲看到:HelloWorld!信息。脚本编写完毕,如何来执行呢,首先执行shell脚本需要执行权限,赋予执行权限:chmodo+xfirst_shell.sh然后./first_shell.sh执行即可;也可以直接使用命令执行:/bin/shfirst_shell.sh,显示效果一样。2.Shell编程之变量详解Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。例如在脚本里面定义A=123,定义这样一个变量,前面变量名,后面是变量的值。引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?如下:#!/bin/bash#Authorwugk2014-06-10A=123echo“Printfvariablesequalis$A”执行脚本:shtest.sh,结果将会显示:Printfvariablesequalis123简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。例如定义变量name=wuguangke执行echo$name将会显示wuguangkeSHELL常见的系统变量解析:$0当前程序的名称$n当前程序的第n个参数,n=1,2,…9$*当前程序的所有参数(不包括程序本身)$#当前程序的参数个数(不包括程序本身)$?命令或程序执行完后的状态,一般返回0表示执行成功。$UID当前用户的ID$PWD当前所在的目录我们来测试一个常用变量的脚本:viauto_var.sh#!/bin/bash#autoprintvariables#bywugk2014-09echo-e'\033[32m-----------------------------\033[0m'echoThisis$0param!echoThis\$1is$1param!echoThis\$2is$2param!echo-e'\033[32m-----------------------------\033[0m'echoThis\$*is$*param!echoThis\$#is$#param!echoThis\$?is$?param!echo紧接着我们来编写一个简单的echo打印菜单:#!/bin/bash#autoinstallhttpd#bywugk2014-09echo-e'\033[32m-----------------------------\033[0m'FILES=httpd-2.2.17.tar.bz2URL==/usr/local/apache2/echo-e\033[36mPleaseSelectInstallMenu:\033[0mechoecho1)官方下载Httpd文件包.echo2)解压apache源码包.echo3)编译安装Httpd服务器.echo4)启动HTTPD服务器.echo-e'\033[32m-----------------------------\033[0m'sleep203.If条件语句学习在LinuxShell编程中,if、for、while、case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。下面将逐个来讲解具体的用法:If条件判断语句if(表达式)#if(VariableinArray)语句1else语句2fi案例一,测试数字大小#!/bin/shNUM=100if(($NUM4));thenecho“thisnumis$NUMgreater4!”fi案例二,测试目录是否存在,不存在则新建(注意,中括号之间必须要空格)#!/bin/sh#judgedirexistif[!-d/data/20140515];thenmkdir-p/data/20140515elseecho“ThisDIRisexist,Pleaseexit…..”fi逻辑运算符解析:-f判断文件是否存在eg:if[-ffilename]-d判断目录是否存在eg:if[-ddir]-eq等于应用于:整型比较-ne不等于应用于:整型比较-lt小于应用于:整型比较-gt大于应用于:整型比较-le小于或等于应用于:整型比较-ge大于或等于应用于:整型比较-a双方都成立(and)逻辑表达式–a逻辑表达式-o单方成立(or)逻辑表达式–o逻辑表达式-z空字符串案例三,多个条件测试判断#!/bin/shscores=80if[[$scores-gt85]];thenechoverygood!;elif[[$scores-gt75]];thenechogood!;elif[[$scores-gt60]];thenechopass!;elseechonopass!fi4.使用if条件语句编写MySQL备份脚本a)自动备份Mysql数据库脚本#!/bin/sh#autobackupmysql#wugk2012-12-12#DefinePATH定义变量BAKDIR=/data/backup/mysql/`date+%Y-%m-%d`MYSQLDB=webappMYSQLPW=backupMYSQLUSR=backup#mustuserootuserrunscripts必须使用root用户运行,$UID为系统变量if[$UID-ne0];thenechoThisscriptmustusetherootuser!!!sleep2exit0fi#DefineDIRandmkdirDIR判断目录是否存在,不存在则新建if[!-d$BAKDIR];thenmkdir-p$BAKDIRelseechoThisis$BAKDIRexists....fi#Usemysqldumpbackupmysql使用mysqldump备份数据库/usr/bin/mysqldump-u$MYSQLUSR-p$MYSQLPW-d$MYSQLDB$BAKDIR/webapp_db.sqlechoThemysqlbackupsuccessfully5.IF条件综合Shell实战脚本编写通过if语句和之前变量的学习,今天我们将把我们所学的综合在一起来讲解一个实战运维脚本,一键安装LAMP环境的脚本:一键源码安装LAMP脚本,先分解脚本的各个功能:打印菜单:1)安装apacheWEB服务器2)安装MysqlDB服务器3)安装PHP服务器4)整合LAMP架构并启动服务1、Apache服务器安装部署。下载httpd-2.2.27.tar.gz版本,下载URL,解压,进入安装目录,configure;make;makeinstall2、Mysql服务器的安装。下载mysql-5.5.20.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;makeinstall3、PHP服务器安装。下载php-5.3.8.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;makeinstall4、LAMP架构的整合和服务启动。/usr/local/apache2/bin/apachectlstartvihtdocs/index.php?phpphpinfo();?viauto