人人都能学会的企业SHELL编程v2由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“linux编程之shell入门”。
人人都能学会的SHELL编程
目 录
1.Shell入门简介.......................................................................................................2 2.Shell编程之变量详解...........................................................................................5 3.If条件语句学习.....................................................................................................8 4.使用if条件语句编写MySQL备份脚本..............................................................10 5.IF条件综合Shell实战脚本编写.......................................................................11 6.循环语句for.........................................................................................................20 7.循环语句while.....................................................................................................22 8.Until循环语句.....................................................................................................23 9.Case选择语句.......................................................................................................23 10.select选择语句.................................................................................................25 11.Shell编程函数讲解...........................................................................................25 12.Shell数组编程...................................................................................................27 13.Shell编程之awk、sed命令案例分析.............................................................30 14.全备和增量备份Linux系统脚本......................................................................31 15.Shell编程之系统硬件信息数据库收集...........................................................34 16.Shell编程之磁盘报警高级脚本.......................................................................37 17.Shell编程之服务监控检查脚本.......................................................................40 18.Shell编程之实战WEB界面展示一...................................................................40 19.Shell编程之实战WEB界面展示二...................................................................40 20.Shell编程之学习心得分享及拓展...................................................................40
1.Shell入门简介
说到Shell编程,我想很多从事Linux运维工作的朋友都不陌生,都对Shell有基本的了解,可能大家刚开始接触Shell的时候,有各种想法? 能不能不学? 高大上?
到底是浮云?还是神马?
很难啊?
我想告诉大家的是,大家有这些想法一点都不觉得惊讶,为什么?这些都很正常,对于任何一件事情在未开始之前,肯定会有总总假设,那我今天想说的是,学完人人都会Shell编程后,我们会觉得一切的Shell都是浮云,我们每个人都能很好的使用它,驾驭它,更好的完成我们日常运维的工作。
曾经有人说过,玩Linux不知道Shell,那就是不懂Linux;现在细细品味确实是这样。为了让更多的人能接触Shell、了解Shell,使用Shell,所以今天开设了这样一个网络课程,让我们的Shell飞起来。
好的,其他不多说了,我们正式进入主题,什么是Shell呢? Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell脚本编程去运行。
Linux Shell种类非常多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。
最常用的shell是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。接下来我们来写一个简单的shell脚本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)vi first_shell.sh #!/bin/bash #This is my First shell echo “Hello World!”
这就是我们的第一个脚本,是不是很简单呢,注解如下:
#!/bin/bash //表示定义该脚本是一个shell脚本(固定格式)。#This is my First shell //这里的#号属于注解,没有任何的意义,SHELL不会解析它。
echo “Hello World!” //shell脚本主命令,我们执行这个脚本讲看到: Hello World!信息。
脚本编写完毕,如何来执行呢,首先执行shell脚本需要执行权限,赋予执行权限:
chmod o+x first_shell.sh 然后./first_shell.sh执行即可;也可以直接使用命令执行: /bin/sh first_shell.sh,显示效果一样。2.Shell编程之变量详解
Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。
例如在脚本里面定义A=123 ,定义这样一个变量,前面变量名,后面是变量的值。
引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?如下: #!/bin/bash #Author wugk 2014-06-10 A=123 echo “Printf variables equal is $A” 执行脚本:sh test.sh,结果将会显示: Printf variables equal is 123 简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。
例如定义变量 name=wuguangke 执行echo $name 将会显示wuguangke SHELL常见的系统变量解析: $0 当前程序的名称
$n 当前程序的第n个参数,n=1,2,„9 $* 当前程序的所有参数(不包括程序本身)$# 当前程序的参数个数(不包括程序本身)$? 命令或程序执行完后的状态,一般返回0表示执行成功。$UID 当前用户的ID $PWD 当前所在的目录
我们来测试一个常用变量的脚本:vi auto_var.sh #!/bin/bash #auto print variables #by wugk 2014-09 echo-e ' 33[32m----------------------------- 33[0m' echo “This is $0 param!” echo “This $1 is $1 param!” echo “This $2 is $2 param!” echo-e ' 33[32m----------------------------- 33[0m' echo “This $* is $* param!” echo “This $# is $# param!” echo “This $? is $? param!” echo
紧接着我们来编写一个简单的echo打印菜单: #!/bin/bash #auto install httpd #by wugk 2014-09 echo-e ' 33[32m----------------------------- 33[0m' FILES=httpd-2.2.17.tar.bz2 URL=http://mirrors.cnnic.cn//g' $H_PREFIX/conf/httpd.conf $H_PREFIX/bin/apachectl restart
echo “AddType application/x-httpd-php.php” >>$H_PREFIX/conf/httpd.conf IP=`ifconfig eth1|grep “Bcast”|awk '{print $2}'|cut-d:-f2` echo “You can acce http://$IP/”
cat >$H_PREFIX/htdocs/index.php EOF Fi 6.循环语句for For 变量 in 字符串 do 语句1 done 案例一,打印seq数字循环
#!/bin/sh for i in `seq 15` do
echo “NUM is $i”
done 案例二,求和1-100的值 #!/bin/bash #auto sum 1 100 j=0 for((i=1;i
tar –czf 2014log.tgz $i done 案例四,远程主机批量传输文件: #!/bin/bash #auto scp files for client #by authors wugk 2014 for i in `seq 100 200` do scp-r /tmp/test.txt root@192.168.1.$i:/data/webapps/www.daodoc.comnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/ function Apache_install(){ #Install httpd web server if [[ “$1”-eq “1” ]];then
wget-c $H_URL/$H_FILES && tar-jxvf $H_FILES && cd $H_FILES_DIR &&./configure--prefix=$H_PREFIX if [ $?-eq 0 ];then
make && make install
echo-e “n 33[32m---------------- 33[0m”
echo-e “ 33[32mThe $H_FILES_DIR Server Install Succe! 33[0m” else
echo-e “ 33[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......”
exit 0 fi fi } Apache_install直接调用函数就会去运行函数里面定义的代码了。12.Shell数组编程
数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。
今天这里我们来探讨一维数组的定义、统计、引用和删除等操作。首先来定义一个一维数组:
A=(test1 test2 test3),定义数组一般以括号的方式来定义,数组的值可以随机定义。如何来引用呢? echo ${A[0]},代表引用第一个数组变量,结果会显示test1,数组引用从0开始,代表第一个数组,依次类推。
echo ${A[1]},代表引用第二个数组变量,结果会显示test2,数组引用也是从0开始计算的。
如何显示该数组所有参数呢?echo ${A[@]} 将显示所有参数test1 test2 test3。
如何显示该数组参数个数呢?echo ${#A[@]} 将显示该数组的参数个数3。
如果替换某个数组呢?例如替换第二个test2数组为test5:echo ${A[@]/test2/test5} 如何删除一个数组呢?例如删除test3数组命令为:unset A[2];echo ${A[@]}查看效果。
那输入如何在编程来使用呢?请看下面例子: #!/bin/sh #Auto Make KVM Virtualization #Auto config bond scripts eth_bond(){ NETWORK=(HWADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $1}'` IPADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $2}'` NETMASK=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $3}'` GATEWAY=`route-n|grep “UG”|awk '{print $2}'`)cat >ifcfg-bond0
在我们日常的Shell编程中我们会用到很多的一些语句,有的语句,如果用好了,可以让我们的脚本更上一层楼,让我们的功能更容易满足企业的需求。Sed命令:
sed 's/192/10/g' test.txt 把文件里面的192字符替换为10
在文件开头或者结尾添加字符:
Awk命令: Find命令: Grep正则: 14.全备和增量备份Linux系统脚本
在Linux中,我们经常需要备份系统重要文件,例如/etc、/boot分区、重要网站数据等等,如果每天都完整备份的话,会占用很大的空间,那我们改如何来备份呢? 这里采用如下方法来备份:
每周日进行完整备份,其余每天为增量备份。那使用什么命令来备份呢,我们使用tar命令: 全备份:tar-g /tmp/snapshot-czvf /tmp/2014_full_system_data.tar.gz /data/sh/ 增量备: tar-g /tmp/snapshot-czvf /tmp/2014_add01_system_data.tar.gz /data/sh/
#!/bin/sh #Automatic Backup Linux System Files #Author wugk 2013-11-22 #Define Variable SOURCE_DIR=($*)TARGET_DIR=/data/backup/ YEAR=`date +%Y` MONTH=`date +%m` DAY=`date +%d` WEEK=`date +%u` A_NAME=`date +%H%M` FILES=system_backup.tgz CODE=$? if [-z “$*” ];then echo-e “ 33[32mUsage:nPlease Enter Your Backup Files or Directoriesn-------------nnUsage: { $0 /boot /etc} 33[0m” exit fi #Determine Whether the Target Directory Exists if [!-d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then mkdir-p $TARGET_DIR/$YEAR/$MONTH/$DAY echo-e “ 33[32mThe $TARGET_DIR Created Succefully! 33[0m” fi #EXEC Full_Backup Function Command Full_Backup(){ if [ “$WEEK”-eq “7” ];then rm-rf $TARGET_DIR/snapshot cd $TARGET_DIR/$YEAR/$MONTH/$DAY;tar-g $TARGET_DIR/snapshot-czvf $FILES ${SOURCE_DIR[@]} [ “$CODE” == “0” ]&&echo-e “-------------n 33[32mThese Full_Backup System Files Backup Succefully! 33[0m” fi } #Perform incremental BACKUP Function Command Add_Backup(){ if [ $WEEK-ne “7” ];then cd $TARGET_DIR/$YEAR/$MONTH/$DAY;tar-g $TARGET_DIR/snapshot-czvf $A_NAME$FILES ${SOURCE_DIR[@]} [ “$CODE” == “0” ]&&echo-e “----------n 33[32mThese Add_Backup System Files $TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Succefully! 33[0m” fi } sleep 3 Full_Backup;Add_Backup 15.Shell编程之系统硬件信息数据库收集
首先我们创建数据库表,格式如下: CREATE TABLE `audit_audit_system`(`id` int(11)NOT NULL AUTO_INCREMENT,`ip_info` varchar(50)NOT NULL,`serv_info` varchar(50)NOT NULL,`cpu_info` varchar(50)NOT NULL,`disk_info` varchar(50)NOT NULL,`mem_info` varchar(50)NOT NULL,`load_info` varchar(50)NOT NULL,`mark_info` varchar(50)NOT NULL,PRIMARY KEY(`id`),UNIQUE KEY `ip_info`(`ip_info`),UNIQUE KEY `ip_info_2`(`ip_info`));然后编写脚本如下: #!/bin/sh #auto get system info #author wugk 2014-08-29 echo-e “ 33[34m 33[1m” cat
++++++++++++++++++++++++++++++++++++++++++++++ ++++++++Welcome to use system Collect+++++++++ ++++++++++++++++++++++++++++++++++++++++++++++ EOF ip_info=`ifconfig |grep “Bcast”|tail-1 |awk '{print $2}'|cut-d:-f 2` cpu_info1=`cat /proc/cpuinfo |grep 'model name'|tail-1 |awk-F: '{print $2}'|sed 's/^ //g'|awk '{print $1,$3,$4,$NF}'` cpu_info2=`cat /proc/cpuinfo |grep “physical id”|sort |uniq-c|wc-l` serv_info=`hostname |tail-1` disk_info=`fdisk-l|grep “Disk”|grep-v “identifier”|awk '{print $2,$3,$4}'|sed 's/,//g'` mem_info=`free-m |grep “Mem”|awk '{print “Total”,$1,$2“M”}'` load_info=`uptime |awk '{print “Current Load: ”$(NF-2)}'|sed 's/,//g'` mark_info='BeiJing_IDC'
echo-e “ 33[32m------------ 33[1m” echo IPADDR:${ip_info} echo HOSTNAME:$serv_info echo CPU_INFO:${cpu_info1} X${cpu_info2} echo DISK_INFO:$disk_info echo MEM_INFO:$mem_info echo LOAD_INFO:$load_info echo-e “ 33[32m------------ 33[0m”
echo-e-n “ 33[36mYou want to write the data to the databases? 33[1m”;read ensure if “Y” ];then echo “-------------” [ “$ensure” == “yes”-o “$ensure” == “y”-o “$ensure” == echo-e ' 33[31mmysql-uaudit-p123456-D audit-e ''' “insert into audit_audit_system values('','${ip_info}','$serv_info','${cpu_info1} X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')” ''' 33[0m ' else
fi 读取数据库信息:
mysql-uroot-p123-e 'use wugk1;select * from audit_audit_system;'|sed 's/-//g'|grep-v “id” 这样,我们可以把数据库的内容在shell脚本里面调用出来。16.Shell编程之磁盘报警高级脚本 echo “wait exit......” exit 脚本分析:
1、磁盘达到85%发送报警邮件。
2、发送邮件命令格式。
3、多个报警设置。
4、把分区的信息写入文件。
Mail-s “邮件主题”-c”抄送地址”-b “密送地址”-f 发送人邮件地址 –F 发件人姓名 >list.txt` cat
IP_ADDR=`ifconfig eth1|grep “Bcast”|awk '{print $2}'|cut-d:-f 2`
D_Name=`echo $line|awk '{print $1,$NF“分区”}'`
D_Total=`echo $line|awk '{print $2}'`
D_Avail=`echo $line|awk '{print $4}'`
D_Percent=`echo $line|awk '{print $5}'|sed 's/%//g'`
if [ “$D_Percent”-ge 50 ];then cat >email.txt
日期/时间: 周二 2014年11月11日 15时:15分:53秒 CST 额外信息: CRITICAL-DISK Monitor:$D_Name Used more than ${D_Percent}% EOF EOF
echo-e “ 33[32mThe $D_Name has been used for more than ${D_Percent}% ,Please Check. 33[0m” mail-s “$D_Name Warning” wgkgood@163.com
#echo “The $D_Name has been used for more than ${D_Percent}% ,Please Check.”|mail-s “$D_Name Warning” wgkgood@163.com
fi done
Shell编程之服务监控检查脚本 Shell编程之实战WEB界面展示一 Shell编程之实战WEB界面展示二 Shell编程之学习心得分享及拓展
shell的作用: 是一个软件, 一个cli, 一门解释型的面向过程的程序设计语言shell如何解析一个完整的命令行? 命令行的处理过程如下:1.历史命令替换2.命令行拆分为token(单词)(......
shell编程实例集锦【ZT】shell编程实例集锦 如何远程杀死僵进程?所谓“僵进程”是指处于睡眠中,而且没用的进程。在进行并行计算时经常会有僵进程产生。由于用 top 看不到“......
刀豆文库小编为你整合推荐8篇《人人都能成功》读后感,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
刀豆文库小编为你整合推荐8篇人人都能成功读后感,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
人人都能成功读后感(一)《人人都能成功》是拿破仑希尔的具有代表性的著作,另外还有《成功规律》和《思考致富》等。拿破仑希尔是全世界最早的现代成功学大师和励志书籍作家,曾经......