人人都能学会的企业SHELL编程精品文档.docx
《人人都能学会的企业SHELL编程精品文档.docx》由会员分享,可在线阅读,更多相关《人人都能学会的企业SHELL编程精品文档.docx(24页珍藏版)》请在冰豆网上搜索。
人人都能学会的企业SHELL编程精品文档
人人都能学会的SHELL编程
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
#ThisismyFirstshell
echo“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-10
A=123
echo“Printfvariablesequalis$A”
执行脚本:
shtest.sh,结果将会显示:
Printfvariablesequalis123
简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。
例如定义变量name=wuguangke
执行echo$name将会显示wuguangke
SHELL常见的系统变量解析:
$0当前程序的名称
$n当前程序的第n个参数,n=1,2,…9
$*当前程序的所有参数(不包括程序本身)
$#当前程序的参数个数(不包括程序本身)
$?
命令或程序执行完后的状态,一般返回0表示执行成功。
$UID当前用户的ID
$PWD当前所在的目录
我们来测试一个常用变量的脚本:
viauto_var.sh
#!
/bin/bash
#autoprintvariables
#bywugk2014-09
echo-e'\033[32m-----------------------------\033[0m'
echo"Thisis$0param!
"
echo"This\$1is$1param!
"
echo"This\$2is$2param!
"
echo-e'\033[32m-----------------------------\033[0m'
echo"This\$*is$*param!
"
echo"This\$#is$#param!
"
echo"This\$?
is$?
param!
"
echo
紧接着我们来编写一个简单的echo打印菜单:
#!
/bin/bash
#autoinstallhttpd
#bywugk2014-09
echo-e'\033[32m-----------------------------\033[0m'
FILES=httpd-2.2.17.tar.bz2
URL=
PREFIX=/usr/local/apache2/
echo-e"\033[36mPleaseSelectInstallMenu:
\033[0m"
echo
echo"1)官方下载Httpd文件包."
echo"2)解压apache源码包."
echo"3)编译安装Httpd服务器."
echo"4)启动HTTPD服务器."
echo-e'\033[32m-----------------------------\033[0m'
sleep20
3.If条件语句学习
在LinuxShell编程中,if、for、while、case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。
下面将逐个来讲解具体的用法:
ØIf条件判断语句
if(表达式)#if(VariableinArray)
语句1
else
语句2
fi
案例一,测试数字大小
#!
/bin/sh
NUM=100
if(($NUM>4));then
echo“thisnumis$NUMgreater4!
”
fi
案例二,测试目录是否存在,不存在则新建(注意,中括号之间必须要空格)
#!
/bin/sh
#judgedirexist
if[!
-d/data/20140515];then
mkdir-p/data/20140515
else
echo“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/sh
scores=80
if[[$scores-gt85]];then
echo"verygood!
";
elif[[$scores-gt75]];then
echo"good!
";
elif[[$scores-gt60]];then
echo"pass!
";
else
echo"nopass!
"
fi
4.使用if条件语句编写MySQL备份脚本
a)自动备份Mysql数据库脚本
#!
/bin/sh
#autobackupmysql
#wugk2012-12-12
#DefinePATH定义变量
BAKDIR=/data/backup/mysql/`date+%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
#mustuserootuserrunscripts必须使用root用户运行,$UID为系统变量
if
[$UID-ne0];then
echoThisscriptmustusetherootuser!
!
!
sleep2
exit0
fi
#DefineDIRandmkdirDIR判断目录是否存在,不存在则新建
if
[!
-d$BAKDIR];then
mkdir-p$BAKDIR
else
echoThisis$BAKDIRexists....
fi
#Usemysqldumpbackupmysql使用mysqldump备份数据库
/usr/bin/mysqldump-u$MYSQLUSR-p$MYSQLPW-d$MYSQLDB>$BAKDIR/webapp_db.sql
echo"Themysqlbackupsuccessfully"
5.IF条件综合Shell实战脚本编写
通过if语句和之前变量的学习,今天我们将把我们所学的综合在一起来讲解一个实战运维脚本,一键安装LAMP环境的脚本:
一键源码安装LAMP脚本,先分解脚本的各个功能:
打印菜单:
1)安装apacheWEB服务器
2)安装MysqlDB服务器
3)安装PHP服务器
4)整合LAMP架构并启动服务
1、Apache服务器安装部署。
下载httpd-2.2.27.tar.gz版本,下载URL,解压,进入安装目录,configure;make;makeinstall
2、Mysql服务器的安装。
下载mysql-5.5.20.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;makeinstall
3、PHP服务器安装。
下载php-5.3.8.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;makeinstall
4、LAMP架构的整合和服务启动。
/usr/local/apache2/bin/apachectlstart
vihtdocs/index.php
php
phpinfo();
?
>
viauto_lamp.sh内容如下:
#!
/bin/bash
#autoinstallLAMP
#bywugk2014-11
#Httpddefinepathvariable
H_FILES=httpd-2.2.27.tar.bz2
H_FILES_DIR=httpd-2.2.27
H_URL=
H_PREFIX=/usr/local/apache2/
#MySQLdefinepathvariable
M_FILES=mysql-5.5.20.tar.gz
M_FILES_DIR=mysql-5.5.20
M_URL=
M_PREFIX=/usr/local/mysql/
#PHPdefinepathvariable
P_FILES=php-5.3.28.tar.bz2
P_FILES_DIR=php-5.3.28
P_URL=
P_PREFIX=/usr/local/php5/
echo-e'\033[32m-----------------------------\033[0m'
echo
if[-z"$1"];then
echo-e"\033[36mPleaseSelectInstallMenufollow:
\033[0m"
echo-e"\033[32m1)编译安装Apache服务器\033[1m"
echo"2)编译安装MySQL服务器"
echo"3)编译安装PHP服务器"
echo"4)配置index.php并启动LAMP服务"
echo-e"\033[31mUsage:
{/bin/sh$01|2|3|4|help}\033[0m"
exit
fi
if[["$1"-eq"help"]];then
echo-e"\033[36mPleaseSelectInstallMenufollow:
\033[0m"
echo-e"\033[32m1)编译安装Apache服务器\033[1m"
echo"2)编译安装MySQL服务器"
echo"3)编译安装PHP服务器"
echo"4)配置index.php并启动LAMP服务"
echo-e"\033[31mUsage:
{/bin/sh$01|2|3|4|help}\033[0m"
exit
fi
######################################
#Installhttpdwebserver
if[["$1"-eq"1"]];then
wget-c$H_URL/$H_FILES&&tar-jxvf$H_FILES&&cd$H_FILES_DIR&&./configure--prefix=$H_PREFIX
if[$?
-eq0];then
make&&makeinstall
echo-e"\n\033[32m-----------------------------------------------\033[0m"
echo-e"\033[32mThe$H_FILES_DIRServerInstallSuccess!
\033[0m"
else
echo-e"\033[32mThe$H_FILES_DIRMakeorMakeinstallERROR,PleaseCheck......"
exit0
fi
fi
#InstallMysqlDBserver
if[["$1"-eq"2"]];then
wget-c$M_URL/$M_FILES&&tar-xzvf$M_FILES&&cd$M_FILES_DIR&&yuminstallcmake-y;cmake.-DCMAKE_INSTALL_PREFIX=$M_PREFIX\
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock\
-DMYSQL_DATADIR=/data/mysql\
-DSYSCONFDIR=/etc\
-DMYSQL_USER=mysql\
-DMYSQL_TCP_PORT=3306\
-DWITH_XTRADB_STORAGE_ENGINE=1\
-DWITH_INNOBASE_STORAGE_ENGINE=1\
-DWITH_PARTITION_STORAGE_ENGINE=1\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1\
-DWITH_MYISAM_STORAGE_ENGINE=1\
-DWITH_READLINE=1\
-DENABLED_LOCAL_INFILE=1\
-DWITH_EXTRA_CHARSETS=1\
-DDEFAULT_CHARSET=utf8\
-DDEFAULT_COLLATION=utf8_general_ci\
-DEXTRA_CHARSETS=all\
-DWITH_BIG_TABLES=1\
-DWITH_DEBUG=0
make&&makeinstall
/bin/cpsupport-files/my-f/etc/my.conf
/bin/cpsupport-files/mysql.server/etc/init.d/mysqld
chmod+x/etc/init.d/mysqld
chkconfig--addmysqld
chkconfigmysqldon
if[$?
-eq0];then
make&&makeinstall
echo-e"\n\033[32m-----------------------------------------------\033[0m"
echo-e"\033[32mThe$M_FILES_DIRServerInstallSuccess!
\033[0m"
else
echo-e"\033[32mThe$M_FILES_DIRMakeorMakeinstallERROR,PleaseCheck......"
exit0
fi
fi
#InstallPHPserver
if[["$1"-eq"3"]];then
wget-c$P_URL/$P_FILES&&tar-jxvf$P_FILES&&cd$P_FILES_DIR&&./configure--prefix=$P_PREFIX--with-config-file-path=$P_PREFIX/etc--with-mysql=$M_PREFIX--with-apxs2=$H_PREFIX/bin/apxs
if[$?
-eq0];then
makeZEND_EXTRA_LIBS='-liconv'&&makeinstall
echo-e"\n\033[32m-----------------------------------------------\033[0m"
echo-e"\033[32mThe$P_FILES_DIRServerInstallSuccess!
\033[0m"
else
echo-e"\033[32mThe$P_FILES_DIRMakeorMakeinstallERROR,PleaseCheck......"
exit0
fi
fi
####################################
if[["$1"-eq"4"]];then
sed-i'/DirectoryIndex/s/index.html/index.phpindex.html/g'$H_PREFIX/conf/httpd.conf
$H_PREFIX/bin/apachectlrestart
echo"AddTypeapplication/x-httpd-php.php">>$H_PREFIX/conf/httpd.conf
IP=`ifconfigeth1|grep"Bcast"|awk'{print$2}'|cut-d:
-f2`
echo"Youcanaccesshttp:
//$IP/"
cat>$H_PREFIX/htdocs/index.php<php
phpinfo();
?
>
EOF
Fi
6.循环语句for
For变量in字符串
do
语句1
done
案例一,打印seq数字循环
#!
/bin/sh
foriin`seq15`
do
echo“NUMis$i”
done
案例二,求和1-100的值
#!
/bin/bash
#autosum1100
j=0
for((i=1;i<=100;i++))
do
j=`expr$i+$j`
done
echo$j
案例三,找到相关log,然后批量打包
#!
/bin/sh
foriin`find/var/log-name“*.log”`
do
tar–czf2014log.tgz$i
done
案例四,远程主机批量传输文件:
#!
/bin/bash
#autoscpfilesforclient
#byauthorswugk2014
foriin`seq100200`
do
scp-r/tmp/test.txtroot@192.168.1.$i:
/data/webapps/www
Done
案例五,远程主机批量执行命令:
#!
/bin/bash
#autoscpfilesforclient
#byauthorswugk2014
foriin`seq100200`
do
ssh-lroot192.168.1.$i‘ls/tmp’
done
7.循环语句while
while条件语句
do
语句1
done
案例一,while条件判断数字
#!
/bin/sh
i=1;
while[[$i-lt10]];do
echo$i;
((i++));
done;
案例二,扩展讲解linuxread命令
read-p‘PleaseInputnumber:
’
案例三,while逐行读取某个文件
#!
/bin/sh
whilereadline
do
echo$line;
done
综合脚本编写:
8.Until循环语句
until条件
do
action
done
直到满足条件,才退出。
否则执行action。
案例一,条件判断数字
#!
/bin/sh
a=10;
until[[$a-lt0]];do
echo$a;
((a--));
don