SHELL编程

说到shell编程,很多从事Linux运维工作的朋友都不陌生,都对shell有基本的了解,读者可能刚开始接触shell的时候,有各种想法,感觉编程非常困难,但shell编程是所有编程语言中最容易上手,最容易学习的编程脚本语言。
本章向读者介绍shell编程入门、shell编程变量、if、while、for、case、select基本语句案例演练及shell编程四剑客find、grep、awk、sed深度剖析等内容。
一、shell编程入门简介
曾经有人说过,学习Linux不知道shell编程,那就是不懂Linux,现在细细品味确实是这样。shell是操作系统的最外层,shell可以合并编程语言以控制进程和文件,以及启动和控制其他程序。
shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说shell就是一个用户跟操作系统之间的一个命令解释器。
shell是用户与Linux操作系统之间沟通的桥梁,用户可以输入命令执行,又可以利用shell脚本编程去运行,如图所示。
在这里插入图片描述

shell、utilites及kernel位置关系

Linux shell种类非常多,常见的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编程、shell脚本、shell命令之间都有什么区别呢?简单来说:shell是一个整体的概念,shell编程与shell脚本统称为shell编程,shell命令是shell编程底层具体的语句和实现方法。
shell脚本及Hello World
要熟练掌握shell编程语言,需要大量的练习,初学者可以用shell打印“Hello World”字符,寓意着开始新的启程!
shell脚本编程需要注意以下几个事项:
•□ shell脚本名称命名一般为英文的大写、小写;
•□ 不能使用特殊符号、空格来命名;
•□ shell脚本后缀以.sh结尾;
•□ 不建议shell命名为纯数字,一般以脚本功能命名;
•□ shell脚本内容首行需以#!/bin/bash开头;
•□ shell脚本中变量名称尽量使用大写字母,字母间不能使用“-”,可以使用“”;
•□ shell脚本变量名称不能以数字、特殊符号开头。
以下为第一个shell编程脚本,脚本名称为first_shell.sh,代码如下:
#! /bin/bash
#By Author song
echo “hello world !”
自己创建first_shell.sh文件,输入以上内容即可
first_shell.sh脚本内容详解如下:
•□ #!/bin/bash:固定格式,定义该脚本所使用的shell类型。
•□ #By author song:表示脚本创建人,#号表示注解。
•□ echo“Hello World!”shell脚本主命令,执行该脚本呈现的内容。
shell脚本编写完毕,如果运行该脚本,运行用户需要有执行权限,可以使用chmod o+x first_shell.sh赋予可执行权限。然后./first_shell.sh执行即可,还可以直接使用命令执行/ bin/sh first_shell.sh直接运行脚本,不需要执行权限,最终脚本执行显示效果一样。
初学者学习shell编程,可以将在shell终端运行的各种命令依次写入到脚本内容中,可以把shell脚本当成是shell命令的堆积。
二、shell编程之变量详解
shell属于非类型的解释型语言,在使用变量时不像C++、JAVA语言编程时需要事先声明变量,shell给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号“=”为变量赋值,shell为弱类型语言,定义变量不需要声明类型,如果在使用时需要明确变量的类型,可以使用declare指定类型,declare常见参数如下:
•□ +/-:“-”可用来指定变量的属性,“+”为取消变量所设的属性。
•□ -f:仅显示函数。
•□ r:将变量设置为只读。
•□ x:指定的变量会成为环境变量,可供shell以外的程序来使用。
•□ i:指定类型为数值,字符串或运算式。
shell编程中变量分为3种:系统变量、环境变量、用户变量,其中系统变量在对参数判断和命令返回值判断时使用,而环境变量则主要是在程序运行时需要设置,用户变量又称为局部变量,多使用在shell脚本内部或者临时局部。
shell变量名在定义时,首个字符必须为字母(a~z,A~Z),不能以数字开头,中间不能有空格,可以使用下画线“
”,不能使用“-”,也不能使用标点符号等。
例如定义变量A=123,定义这样一个变量,A为变量名,123是变量的值,变量名有格式规范,变量的值可以随意指定。变量定义完成,如需要引用变量,可以使用$A。
var.sh脚本内容如下:
#!/bin/bash
#By author yunwei
A=123
echo “今天饭前为$A 斤”
执行该shell脚本,结果将会显示“今天饭前为123 斤”。shell常见的系统变量、环境变量、用户变量详解如下。
(1)shell编程常见系统变量如下:
•□ $0:当前脚本的名称。
□ $n:当前脚本的第n个参数,n=1,2,…,9。
•□ $∗:当前脚本的所有参数(不包括程序本身)。
•□ $#:当前脚本的参数个数(不包括程序本身)。
•□ $?:命令或程序执行完后的状态,返回0表示执行成功。
•□ $$:程序本身的PID号。
(2)shell编程常见环境变量如下:
•□ PATH:命令所示路径,以冒号为分割。
•□ HOME:打印用户家目录。
•□ SHELL:显示当前shell类型。
•□ USER:打印当前用户名。
•□ ID:打印当前用户ID信息。
•□ PWD:显示当前所在路径。
•□ TERM:打印当前终端类型。
•□ HOSTNAME:显示当前主机名。
(3)shell编程用户变量如下:
•□ A=jfedu.net:自定义变量A。
•□ N_SOFT=nginx-1.12.0.tar.gz:自定义变量N_SOFT。
•□ BACK_DIR=/data/backup/:自定义变量BACK_DIR。
•□ IP1=192.168.1.11:自定义变量IP1。
•□ IP2=192.168.1.12:自定义变量IP2。
创建echo打印菜单shell脚本,代如下:
#!/bin/bash
#auto install httpd
#By author yunwei

行脚本,执行结果如图所示。
在这里插入图片描述

Linux shell编程中,if、for、while、case等条件流程控制语句用得非常多,熟练掌握以上流程控制语句及语法的实战,对编写shell脚本有非常大的益处。
if条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断,if表达式如下:

if语句shell脚本编程案例如下。
(1)比较两个整数大小,代码如下:
在这里插入图片描述

(2)判断系统目录是否存在,代码如下:
在这里插入图片描述

if常见的判断逻辑运算符详解如下:
•□ -f:判断文件是否存在,例如if[-f filename]。
•□ -d:判断目录是否存在,例如if[-d dir]。
•□ -eq:等于,应用于整型比较,即equal。
•□ -ne:不等于,应用于整型比较,即not equal。
•□ -lt:小于,应用于整型比较,即letter。
•□ -gt:大于,应用于整型比较,即greater。
•□ -le:小于或等于,应用于整型比较。
•□ -ge:大于或等于,应用于整型比较。
•□ -a:双方都成立(and),用法为逻辑表达式-a逻辑表达式。
•□ -o:单方成立(or),用法为逻辑表达式-o逻辑表达式。
•□ -z:空字符串。
•□ ‖:单方成立。
•□ &&:双方都成立表达式。

If 语句括号的使用总结
1、如果是用> 、< 、 <= 、>= 比较数值的大小的话用(( ))
2、如果单独使用 -d -f -lt -gt -lt -ge -le -ne -f 用[] [[ ]]都可以
3、如果配合-a -o 使用要使用[]
(3)if多个条件测试分数判断,代码如下:
在这里插入图片描述
if判断括号区别
在使用if语句时,经常会使用()、(())、[]、[[]]、{}等括号,以下为几种括号简单区别对比。
•□ ():用于多个命令组、命令替换、初始化数组。
•□ (()):整数扩展、运算符、重定义变量值,算术运算比较。
•□ []:bash内部命令,“[”与test是等同的,正则字符范围、引用数组元素编号,不支持“+”、“-”、“∗”、“/”数学运算符,逻辑测试使用-a、-o。
•□ [[]]:bash程序语言的关键字,不是一个命令,[[]]结构比[]结构更加通用,不支持“+”、“-”、“∗”、“/”数学运算符,逻辑测试使用&&、‖。
•□ {}:主要用于命令集合或者范围,例如mkdir-p/data/201{7,8}/。
MySQL数据库备份脚本
MySQL数据库备份是运维工程师的工作之一,以下为自动备份MySQL数据库脚本,代码如下:

在这里插入图片描述
在这里插入图片描述
for循环语句实战
for循环语句主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于循环某个文件或者列表。其语法格式以for…do开头,done结尾。语法格式如下:
在这里插入图片描述
for循环语句shell脚本编程案例如下。
(1)循环打印BAT企业官网,代码如下:
在这里插入图片描述
(2)循环打印1~100数字,seq表示列出数据范围,代码如下:
在这里插入图片描述
(3)for循环求1~100的总和,代码如下:
在这里插入图片描述
(4)对系统日志文件进行分组打包,代码如下:
在这里插入图片描述
while循环语句实战
while循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾。语法格式如下:
在这里插入图片描述
while循环语句shell脚本编程案例如下。
(1)循环打印BAT企业官网,read指令用于读取行或者读取变量,代码如下:
while read line
do
echo $line
done < shell.txt
其中jfedu.txt内容如下:
(2)while无限每秒输出Hello World,代码如下
在这里插入图片描述
(3)循环打印1~100数字,expr用于运算逻辑工具,代码如下:
在这里插入图片描述
(4)while循环求1~100的总和,代码如下:
在这里插入图片描述
(5)while循环逐行读取文件,代码如下:
在这里插入图片描述
(6)while循环判断输入IP正确性,代码如下:
在这里插入图片描述
(7)每5s循环判断/etc/passwd是否被非法修改,代码如下:
在这里插入图片描述
(8)每10s循环判断jfedu用户是否登录系统,代码如下:
在这里插入图片描述
case选择语句实战
case选择语句主要用于对多个选择条件进行匹配输出,与if…elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以case…in开头,esac结尾。语法格式如下:
在这里插入图片描述
case条件语句shell脚本编程案例如下。
(1)打印monitor及archive选择菜单,代码如下:
在这里插入图片描述
(2)自动修改IP脚本菜单,代码如下
在这里插入图片描述
select选择语句实战
select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾,语法格式如下:
在这里插入图片描述
select选择语句shell脚本编程案例如下。
(1)打印开源操作系统选择,代码如下:
在这里插入图片描述
(2)打印LAMP选择菜单,代码如下:
在这里插入图片描述
shell编程函数实战
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数,shell函数的好处在于只需定义一次,后期随时使用,无须在shell脚本中添加重复的语句块,其语法格式为以“function name(){”开头,以“}”结尾。
shell编程函数默认不能将参数传入()内部,shell函数参数传递在调用函数名称时传递,例如name argv1 argv2,具体代码如下:
在这里插入图片描述
(1)创建Apache软件安装函数,给函数Apache_install传递参数1,代码如下:
加粗样式**
(2)创建judge_ip判断IP函数,代码如下:
在这里插入图片描述
shell编程四剑客之awk
awk是一个优良的文本处理工具,Linux及UNIX环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为awk,awk是一个行级文本高效处理工具,awk经过改进生成的新的版本有nawk、gawk,一般Linux默认为gawk,gawk是awk的GNU开源免费版本。
awk基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。其语法参数格式如下:
在这里插入图片描述

awk常用参数、变量、函数详解如下。
(1)awk基本语法参数详解如下:
•□ 单引号’'是为了和shell命令区分开。
•□ 大括号{}表示一个命令分组。
•□ pattern是一个过滤器,表示匹配pattern条件的行才进行action处理。
□ action是处理动作,常见动作为print。
•□ 使用#作为注释,pattern和action可以只有其一,但不能两者都没有。
(2)awk内置变量详解如下:
•□ FS:分隔符,默认是空格。
•□ OFS:输出分隔符。
•□ NR:当前行数,从1开始。
•□ NF:当前记录字段个数。
•□ $0:当前记录。
•□ $1~$n:当前记录第n个字段(列)。
(3)awk内置函数详解如下:
•□ gsub(r,s):在$0中用s代替r。
•□ index(s,t):返回s中t的第一个位置。
•□ length(s):s的长度。
•□ match(s,r):s是否匹配r。
•□ split(s,a,fs):在fs上将s分成序列a。
•□ substr(s,p):返回s从p开始的子串。
(4)awk常用操作符、运算符及判断符,详解如下:
•□ ++--:增加与减少(前置或后置)。
•□ ^∗∗:指数(右结合性)。
•□ !+-:非、一元(unary)加号、一元减号。
•□ +-∗/%:加、减、乘、除、余数。
•□ ===!==:数字比较。
•□ &&:逻辑and。
□ ‖:逻辑or。
•□ =+=-=∗=/=%=^=∗∗=:赋值。
(5)awk与流程控制语句如下:
•□ if(condition){}else{};
•□ while{};
•□ do{}while(condition);
•□ for(init;condition;step){};
•□ break/continue。
(1)awk打印硬盘设备名称,默认以空格为分割,代码如下:
df -h|awk ‘{print $1}’
(2)awk以空格、冒号、\t、分号为分割,代码如下:

(3)awk以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log下,代码如下:

(4)打印1.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域,代码如下:

(5)打印jfedu.txt文件中的第3行至第5行的第一列与最后一列,代码如下:

(6)打印jfedu.txt文件中长度大于80的行号,代码如下:

(7)awk引用shell变量,使用-v或者双引号+单引号即可,代码如下:

(8)awk以冒号切割,打印第一列同时只显示前5行,代码如下:

(9)awk指定文件jfedu.txt第一列的总和,代码如下:

(10)awk NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕,代码如下:

(11)awk添加自定义字符,代码如下:

(12)awk格式化输出passwd内容,printf打印字符串,%格式化输出分隔符,s表示字符串类型,-12表示12个字符,-6表示6个字符,代码如下:

(13)awk OFS输出格式化\t,代码如下:

(14)awk与if组合实战,判断数字比较,代码如下:

(15)awk与数组组合实战,统计passwd文件用户数,代码如下:

(16)awk分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址,代码如下:

(17)用/etc/shadow文件中的密文部分替换/etc/passwd中的“x”位置,生成新的/ tmp/passwd文件,代码如下:

(18)awk统计服务器状态连接数,代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

shell编程高级企业实战
企业生产环境中,服务器规模成百上千,如果依靠人工去维护和管理是非常吃力的,基于shell编程脚本管理和维护服务器变得简单、从容,而且对企业自动化运维之路的建设起到极大的推动作用。
本节向读者介绍企业生产环境shell编程案例、自动化备份MySQL数据、服务器信息收集、防止恶意IP访问、LAMP+MySQL主从实战、千台服务器IP修改、Nginx+Tomcat高级自动化部署脚本、Nginx虚拟主机配置、Docker管理平台等内容。
shell编程实战系统备份脚本
日常企业运维中,需要备份Linux操作系统中重要的文件和目录,例如/etc、/boot分区、重要网站数据等,在备份数据时,由于数据量非常大,需要指定高效的备份方案,以下为常用的备份数据方案:
•□ 每周日进行完整备份,周一至周六使用增量备份;
•□ 每周六进行完整备份,周日至周五使用增量备份。
企业备份数据的工具主要有tar、cp、rsync、scp、sersync、dd等工具。以下为基于开源tar工具实现系统数据备份方案。
tar工具手动全备份网站,-g参数指定新的快照文

tar工具手动增量备份网站,-g参数指定全备已生成的快照文件,后续增量备份基于上一个增量备份快照文件,代码如下:
在这里插入图片描述

tar工具全备、增量备份网站,shell脚本实现自动打包备份,编程思路如下:
•□ 系统备份数据按每天存放;
•□ 创建完整备份函数块;
•□ 创建增量备份函数块;
•□ 根据星期数判断完整或增量;
•□ 将脚本加入crontab实现自动备份。
tar工具全备、增量备份网站,shell脚本实现自动打包备份,代码如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值