人人都能学会的企业SHELL编程

更新时间:2023-11-19 09:23:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

人人都能学会的SHELL编程

目 录

1. 2. 3. 4. 5. 6. 7. 8. 9.

Shell入门简介...................................... 2 Shell编程之变量详解 ................................ 5 If条件语句学习 ..................................... 8 使用if条件语句编写MySQL备份脚本 ................. 11 IF条件综合Shell实战脚本编写 ...................... 12 循环语句for ...................................... 20 循环语句while..................................... 22 Until循环语句..................................... 23 Case选择语句...................................... 24

10. select选择语句 .................................... 25 11. Shell编程函数讲解 ................................. 25 12. Shell数组编程..................................... 27 13. Shell编程之awk、sed命令案例分析 .................. 30 14. 全备和增量备份Linux系统脚本编写 .................. 31 15. 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脚本编程去运行。

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 '\\033[32m-----------------------------\\033[0m' echo \echo \echo \

echo -e '\\033[32m-----------------------------\\033[0m' echo \echo \echo \echo

紧接着我们来编写一个简单的echo打印菜单: #!/bin/bash

#auto install httpd #by wugk 2014-09

echo -e '\\033[32m-----------------------------\\033[0m'

FILES=httpd-2.2.17.tar.bz2

URL=http://mirrors.cnnic.cn/apache/httpd/ PREFIX=/usr/local/apache2/

echo -e \echo

echo \官方下载Httpd文件包.\echo \解压apache源码包.\echo \编译安装Httpd服务器.\echo \启动HTTPD服务器.\

echo -e '\\033[32m-----------------------------\\033[0m' sleep 20

3. If条件语句学习

在Linux Shell编程中,if、for、while、case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。下面将逐个来讲解具体的用法: ? If条件判断语句

if (表达式) #if ( Variable in Array )

语句1 else 语句2 fi

案例一,测试数字大小 #!/bin/sh NUM=100

if (( $NUM > 4 )) ;then

echo “this num is $NUM greater 4 !” fi

案例二,测试目录是否存在,不存在则新建(注意,中括号之间必须要空格) #!/bin/sh #judge dir exist

if [ ! -d /data/20140515 ];then mkdir -p /data/20140515 else

echo “This DIR is exist,Please exit ?..” fi

逻辑运算符解析:

-f 判断文件是否存在 eg: if [ -f filename ] -d 判断目录是否存在 eg: if [ -d dir ]

-eq 等于 应用于:整型比较 -ne 不等于 应用于:整型比较 -lt 小于 应用于:整型比较 -gt 大于 应用于:整型比较 -le 小于或等于 应用于:整型比较 -ge 大于或等于 应用于:整型比较

-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式 -o 单方成立(or) 逻辑表达式 –o 逻辑表达式 -z 空字符串

案例三,多个条件测试判断 #!/bin/sh scores=80

if [[ $scores -gt 85 ]]; then echo \elif [[ $scores -gt 75 ]]; then echo \

elif [[ $scores -gt 60 ]]; then echo \else

echo \fi

echo -e

\033[0m\

echo -e \Success !\\033[0m\ else

echo -e \ERROR,Please Check......\ exit 0 fi fi

#Install Mysql DB server if [[ \

wget -c $M_URL/$M_FILES && tar -xzvf $M_FILES && cd $M_FILES_DIR &&yum install cmake -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 && make install

/bin/cp support-files/my-small.cnf /etc/my.conf /bin/cp support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on

if [ $? -eq 0 ];then make && make install echo -e

\033[0m\

echo -e \Install Success !\\033[0m\ else

echo -e \$M_FILES_DIR Make or Make install ERROR,Please Check......\ exit 0 fi fi

#Install PHP server if [[ \

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 [ $? -eq 0 ];then

make ZEND_EXTRA_LIBS='-liconv' && make install

echo -e

\033[0m\

echo -e \Install Success !\\033[0m\ else

echo -e \$P_FILES_DIR Make or Make install ERROR,Please Check......\ exit 0 fi fi

####################################

if [[ \

sed -i '/DirectoryIndex/s/index.html/index.php index.html/g' $H_PREFIX/conf/httpd.conf $H_PREFIX/bin/apachectl restart echo \

application/x-httpd-php .php\

IP=`ifconfig eth1|grep \-f2`

echo \

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的值

++++++++++++++++++++++++++++++++++++++++++++++ ++++++++Welcome to use system Collect+++++++++ ++++++++++++++++++++++++++++++++++++++++++++++ EOF

ip_info=`ifconfig |grep \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 \serv_info=`hostname |tail -1`

disk_info=`fdisk -l|grep \$2,$3,$4}'|sed 's/,//g'`

mem_info=`free -m |grep \load_info=`uptime |awk '{print \mark_info='BeiJing_IDC'

echo -e \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 \

echo -e -n \\\033[1m\ if \

echo \

echo -e '\\033[31mmysql -uaudit -p123456 -D audit -e ''' [ \

\

values('','${ip_info}','$serv_info','${cpu_info1}

X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')\\\033[0m ' else fi

读取数据库信息:

mysql -uroot -p123 -e 'use wugk1 ;select * from audit_audit_system;'|sed 's/-//g'|grep -v \

这样,我们可以把数据库的内容在shell脚本里面调用出来。

echo \exit

16. Shell编程之磁盘报警高级脚本

Mail -s “邮件主题” -c”抄送地址” -b “密送地址” -f 发送人邮件地址 –F 发件人姓名 < 要发送的邮件内容 17. 18. 19. 20.

Shell编程之服务监控检查脚本 Shell编程之实战WEB界面展示一 Shell编程之实战WEB界面展示二 Shell编程之学习心得分享及拓展

#!/bin/bash #auto sum 1 100 j=0

for ((i=1;i<=100;i++)) do

j=`expr $i + $j` done echo $j

案例三,找到相关log,然后批量打包 #!/bin/sh

for i in `find /var/log -name do

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

*.log”` “Done

案例五,远程主机批量执行命令: #!/bin/bash

#auto scp files for client #by authors wugk 2014 for i in `seq 100 200` do

ssh -l root 192.168.1.$i done

7. 循环语句while while 条件语句

do

语句1 done

案例一,while条件判断数字 #!/bin/sh i=1;

while [[ $i -lt 10 ]];do

ls /tmp’‘ echo $i; ((i++)); done;

案例二,扩展讲解linux read命令 read -p ‘Please Input number:’ 案例三,while逐行读取某个文件 #!/bin/sh while read line do

echo $line; done < /etc/hosts 综合脚本编写:

8. Until循环语句 until 条件 do action done

直到满足条件,才退出。否则执行action。 案例一,条件判断数字 #!/bin/sh a=10;

until [[ $a -lt 0 ]];do echo $a; ((a--)); done;

9. Case选择语句 case $arg in pattern1) 语句1 ;; pattern2) 语句2 ;; *) 语句3 ;; esac

案例一,创建选择参数脚本 #!/bin/sh case $1 in

monitor_log) monitor_log

;;

archive_log) archive_log ;;

* )

echo \ ;; esac 10.

select选择语句

Select一般用于选择菜单的创建,可以配合PS3来做菜单的打印输出信息。 #!/bin/sh

PS3=\select i in CentOS RedHat Ubuntu do

echo \Done 11.

Shell编程函数讲解

shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数,定义函数的格式:

function name (){ command1 ........

}

name

编写一个Apache安装函数: #!/bin/bash #auto install LAMP #by wugk 2014-11

#Httpd define path variable H_FILES=httpd-2.2.27.tar.bz2 H_FILES_DIR=httpd-2.2.27

H_URL=http://mirrors.cnnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/ function Apache_install() {

#Install httpd web server if [[ \

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

\033[0m\

echo -e \Success !\\033[0m\ else

echo -e \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 \|tr \\\'{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $1}'`

IPADDR=`ifconfig eth0 |egrep \|tr \\\'{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $2}'`

NETMASK=`ifconfig eth0 |egrep \\'s/Mask://g'|awk '{print $3}'`

GATEWAY=`route -n|grep \)

cat >ifcfg-bond0<

${NETWORK[2]} ${NETWORK[3]} ONBOOT=yes TYPE=Ethernet NM_CONTROLLED=no EOF

如上脚本为定义三个数组变量,然后分别来引用,这样让脚本可读性更强,更整洁。关于数组就简单的介绍到这里。 13.

Shell编程之awk、sed命令案例分析

在我们日常的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 \

echo -e \Enter Your Backup Files or Directories\\n--------------------------------------------\\n\\nUsage: { $0 /boot /etc}\\033[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 \Successfully !\\033[0m\fi

#EXEC Full_Backup Function Command Full_Backup() { if

[ \ rm -rf $TARGET_DIR/snapshot

cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES ${SOURCE_DIR[@]}

[ \

\e Full_Backup System Files Backup Successfully !\\033[0m\fi }

#Perform incremental BACKUP Function Command Add_Backup() { if

[ $WEEK -ne \

cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g

$TARGET_DIR/snapshot -czvf $A_NAME$FILES ${SOURCE_DIR[@]} [ \

\Add_Backup System Files

$TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Successfully !\\033[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 \cat <

本文来源:https://www.bwwdw.com/article/dfxv.html

Top