shell解释器:在Linux内核与用户之间的解释器程序。通常指/bin/bash,负责向内核翻译及传达用户/程序指令,相当于操作系统的“外壳”。
交互式(命令行):人工干预、智能化程度高,逐条解释执行、效率低
非交互式(脚本):需要提前设计、智能化难度大,批量执行、效率高,方便在后台静悄悄的运行
常见的shell解释器:/etc/shells文件
![](https://i-blog.csdnimg.cn/blog_migrate/f9469015de8f93598862bdfb09b675b4.png)
不同的解释器的风格不一样
![](https://i-blog.csdnimg.cn/blog_migrate/f5e55425a4054e50aecf45b56fb44796.png)
相较于其他解释器,bash有很多优点如tab键、历史命令、别名、管道、重定向、上下左右键等。
shell脚本:提前写好可执行语句,能够完成特定任务的文件,顺序、批量化处理
脚本的编写规范:
1、脚本的声明(声明使用那种解释器):#!/bin/bash
2、注释信息:#脚本功能变量作用等信息
3、执行指令:ls cd
创建测试脚本
![](https://i-blog.csdnimg.cn/blog_migrate/e29c411b6a9d40f181dabe093d552027.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2c0fcb2e816aa94fa45c720a21334257.png)
第一种执行方式:给执行文件添加x权限,以相对路径和绝对路径执行
![](https://i-blog.csdnimg.cn/blog_migrate/60a7ccbfb1832a26d2273ab906d1943b.png)
登录root进入bash创建子进程bash(脚本声明的)执行脚本命令echo(声明的bash解释器执行echo),执行完后会自动退出
第二种执行方式:使用解释器执行,无需x权限
![](https://i-blog.csdnimg.cn/blog_migrate/d19dd90925c4a145d85ddb43ed30b757.png)
登录root进入bash创建子进程bash(自己开的)执行脚本命令echo(自己开bash解释器执行echo,在脚本文件中没有声明解释器也能执行),执行完后会自动退出
第三种执行方式:使用source或者 . 执行脚本,无需x权限
![](https://i-blog.csdnimg.cn/blog_migrate/2a4606ed0badd9772f6bddabfe8d7387.png)
登录root进入bash执行脚本命令echo-->使用系统的解释器执行,执行完后不会退出
当使用bash和source执行脚本时结果不一样
![](https://i-blog.csdnimg.cn/blog_migrate/f2a15938a5b265c71aa68b3d5e0778f6.png)
使用source命令执行,此时命令执行完成,并且cd进入到创建的目录
![](https://i-blog.csdnimg.cn/blog_migrate/b658d50a49d266c1ef045b3f9e362157.png)
使用bash命令执行后虽然命令完成了,当并没有进入到该目录
![](https://i-blog.csdnimg.cn/blog_migrate/faeb066fd04da2269024500f9b34b025.png)
因为bash使用的是自己开的解释器,执行完脚本后就会退回出到系统的bash解释器,而source使用的就是系统的bash解释器,执行完脚本后不会退出。
使用shell脚本搭建yum仓库
![](https://i-blog.csdnimg.cn/blog_migrate/d21964df3e83930438ffbc05566e7063.png)
此时该yum文件就创建成功
列二搭建网站,&>重定向标准、错误输出到/dev/null
![](https://i-blog.csdnimg.cn/blog_migrate/038d11909629eabdc5f0268573a7e3e9.png)
变量:使用固定的名称存放可能发生变化的值,可以提高脚本的灵活度、适应力。
定义赋值变量:
变量种类:
1,自定义变量,由用户自己修改及使用,《变量名=变量值》名称可以用数字、字母、下划线,不能用数字开头,等号两边不能空格,使用unset 变量名(或者变量名=空),取消变量
![](https://i-blog.csdnimg.cn/blog_migrate/67146703ed5b7e3d2c2533335b5826dd.png)
加上大括号防止和后面的常量混合
![](https://i-blog.csdnimg.cn/blog_migrate/c58c4a3e2877aa46f02775a789d1ae1b.png)
2,环境变量,系统自己定义的,变量名通常大写,由系统维护用来设置工作环境,只有个别变量用户可以直接修改,常见的环境变量有:$USER、$UID、$HOME、$SHELL、$PWD、$HOSTNAME、$PS1(一级提示符)、$PS2(二级提示符)、$PATH(存储命令的路径)
env命令:查看所有环境变量
![](https://i-blog.csdnimg.cn/blog_migrate/36a7763de142e38c3479ab0097c71893.png)
3,位置变量与预定义变量
$1:执行脚本时后面第一个位置参数
$2:执行脚本时后面第二个位置参数
$3:执行脚本时后面第三个位置参数
$*:执行脚本时后面所有位置参数
$#:执行脚本时后面位置参数的个数
$$:当前程序的进程号
$?:判断上一条指令是否执行成功,0成功,非0失败
![](https://i-blog.csdnimg.cn/blog_migrate/42b8dc8196c4c4b63cdd533db6c3e55f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/385b5a7bc7ae898f56ddbf8d25740c1e.png)
编写脚本创建用户并设置密码
![](https://i-blog.csdnimg.cn/blog_migrate/42fb1a8784e4607c404c516042dea9ba.png)
输入位置变量
![](https://i-blog.csdnimg.cn/blog_migrate/a9af978189527b6375688dcbeb19112f.png)
set命令:查看所有变量
![](https://i-blog.csdnimg.cn/blog_migrate/08d6f224cb0f5a55679792cdd2cbccfe.png)
声明全局变量,export 变量名,当新开一个解释器也能使用该变量
![](https://i-blog.csdnimg.cn/blog_migrate/6c5204f8dfeaf232428d07ea459960e3.png)
扩展赋值操作:
双引号 “ ”:允许扩展,以$引用其他变量
单引号 ‘ ’:禁用扩展,即使$也视为普通字符
反撇号 ` `:将命令的执行输出作为变量值(或者$( ) )
![](https://i-blog.csdnimg.cn/blog_migrate/2c6f38a3a64f09f4858e796098387c6c.png)
read标准输入取值:read [-p “提示信息”] 变量名
![](https://i-blog.csdnimg.cn/blog_migrate/c628eafc4521e340fe6474a10f29b03f.png)
变成交互式脚本
![](https://i-blog.csdnimg.cn/blog_migrate/0414e17aa9e7e50e71a33ff35ef6af2f.png)
stty -echo 屏蔽回显,关闭终端输出无显示
stty echo:恢复终端输出
![](https://i-blog.csdnimg.cn/blog_migrate/bd21739762c5754be3652cf82af97884.png)
此时输入密码不会显示在屏幕上
![](https://i-blog.csdnimg.cn/blog_migrate/9071e66e518f2704002ff32ce7c7768a.png)
整数基本运算:1、expr:计算指定的表达式,并输出结果
![](https://i-blog.csdnimg.cn/blog_migrate/bf5b0fc38f0395b0fc2426e55e3fe18e.png)
2、$[ ]:计算结果替换表达式本身,可结合echo命令输出,引用变量可省略$符号,或者使用$(())
![](https://i-blog.csdnimg.cn/blog_migrate/0af11803c6a98573fef99eb5417e5e4b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5e66f2538fcd6b572551ac4796c5cc2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5125eddebb612d8c03f50274358f4d3f.png)
使用bc实现小数运算
![](https://i-blog.csdnimg.cn/blog_migrate/399a78c8e4ba96062691dc05fcae02d9.png)
条件测试:赋予脚本智能判断的能力,1,test 表达式,2,[ 表达式 ] 表达式两边空格
1,对字符串测试。成功返回0,不成功返回非0
==:两边相等
!=:两边不相等
![](https://i-blog.csdnimg.cn/blog_migrate/f35e46297d7526ef21b59baa82a7ceec.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4f4e48c3b0fcdfcf2ca284625028e22d.png)
-z:字符串的值为空,因为没有c变量所有为空
-n:字符串的值不为空
![](https://i-blog.csdnimg.cn/blog_migrate/9eea3965f869ad9372a46a9a0ed09466.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a2c2f389997cb979b022b38d1ab986c0.png)
逻辑组合:条件测试 && 指令(条件成功才执行指令),条件测试 || 指令(条件失败才执行指令)
![](https://i-blog.csdnimg.cn/blog_migrate/9f3a354baa630acc20e3af1983733bee.png)
当执行多个逻辑时A && B && C,A && B必须两个都成功才能执行下一个&& C
![](https://i-blog.csdnimg.cn/blog_migrate/5681654b59e3824271027a5bde852d63.png)
整数值比较:-eq 是否相等,-ne是否不等,-ge是否大于或等于,-le是否小于或等于,-gt是否大于,-lt是否小于。
![](https://i-blog.csdnimg.cn/blog_migrate/48eb642676c24313895171b5bbcfa3be.png)
编写脚本,每两分钟查看用户数量,如果发生变化则发邮件给管理员
![](https://i-blog.csdnimg.cn/blog_migrate/1301f4f26b8ace363ae1d143ba1f001c.png)
创建新用户此时会发送邮件给root
![](https://i-blog.csdnimg.cn/blog_migrate/06e6e6ce8903ad8c15d2aeaeb071031e.png)
把该脚本添加到计划任务中
![](https://i-blog.csdnimg.cn/blog_migrate/e0ef956d2d919db7fd6ce71915336542.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e3b796ba3d49cf1da4c6985c29290434.png)
此时如果添加用户会每两分钟发送邮件
![](https://i-blog.csdnimg.cn/blog_migrate/4e862df7f2c3de525003bf930f681572.png)
可以删除/var/spool/main/root文件,清空邮件
![](https://i-blog.csdnimg.cn/blog_migrate/d23d2a70212cf97878c0de4111c62908.png)
文件状态测试:-e 判断对象是否存在,若存在则为真,-d 判断对象是否为目录。-f 判断对象是否为一般文件,-r 判断对象是否有可读权限,-w 判断对象是否有可写权限,-x 判断是否可执行
![](https://i-blog.csdnimg.cn/blog_migrate/134272841cd7fc7068336dc7cdf49bfe.png)
![](https://i-blog.csdnimg.cn/blog_migrate/17cfc6fe32c9d77e3df2b31e30627f3c.png)
if选择语句:
1、单分支结构:当“条件成立”时执行命令序列,否则不执行任何操作
![](https://i-blog.csdnimg.cn/blog_migrate/f932dc4e84ef60286923b048db73e219.png)
此时只有当root执行该命令时才会输出信息
![](https://i-blog.csdnimg.cn/blog_migrate/7732b1cae5b741ad297191a7c9116c16.png)
2、双分支结构:当“条件成立”时执行命令1序列,否则执行命令2序列
![](https://i-blog.csdnimg.cn/blog_migrate/a3de1aa2cbb70717cdd20ccad5e34921.png)
此时当不是root时会提示信息
![](https://i-blog.csdnimg.cn/blog_migrate/e40c97cd8dd21d837e64069c2ef19997.png)
编写ping脚本
![](https://i-blog.csdnimg.cn/blog_migrate/9fcad11057841c10d116eb4a1aeb2e74.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8b8e7b1dd7b92ab817a6ce86e34912f5.png)
或者使用交互式命令
![](https://i-blog.csdnimg.cn/blog_migrate/d82d9158357a25ec6065e02eb13a9eaa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/86431d0e55f99dbd63d6ddc8abbd9eb7.png)
3、多分支结构:相当于if语句嵌套,针对多个条件分别执行不同的操作。
![](https://i-blog.csdnimg.cn/blog_migrate/a1ed489356ce11e459ebee52b93a7e3b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/736a375ffc1b54497c5ef39dd8dc3d97.png)
循环结构:
1、for循环:根据变量的不同取值,重复执行命令序列
![](https://i-blog.csdnimg.cn/blog_migrate/4edfe0a884833a5309014359b9279b57.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6dd5b4251f4a5e46265beb39ddb7f634.png)
如果采用变量,{1..$a}内的变量系统只会翻译一次,把$a翻译为{1..10},不会展开输出10次
![](https://i-blog.csdnimg.cn/blog_migrate/51dd8bdb23f38a38eb51b0d1f72a4d1c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e064579416f0696ac8d070387b1c66cd.png)
需要使用
seq命令展开变量
![](https://i-blog.csdnimg.cn/blog_migrate/db370d7d8c9432ebfa3dfc34a3ece53c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f407d66813aa4d9c0dca5dddb3c2d5a8.png)
①编写批量创建用户脚本
首先创建存放用户名称文件
![](https://i-blog.csdnimg.cn/blog_migrate/fa4ebfee6a1ef1c57064dde598cb903d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/27381640d82df50f71fd69d545be60b1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/798cf41c2cd3aa62b2243315d217392f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dfda78ee28a1a544af7881f95744207e.png)
②编写ping很多ip地址
![](https://i-blog.csdnimg.cn/blog_migrate/b3633c6f8f9936f1964c6e5d3b2fb554.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9ba20e03d1a906086d5144d81477ee44.png)
for的C语言风格
![](https://i-blog.csdnimg.cn/blog_migrate/e2e93daf813daef1bba21417863bb909.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c917374d53200c9fd6764daa703dea97.png)
2、while循环:反复测试条件,只要成立就执行命令序列
![](https://i-blog.csdnimg.cn/blog_migrate/18a2b7da558363d93dfbe7c8ad59dc8e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d980fc9b41ccacb9e3145cda0d5c16a8.png)
exit可以终止循环(脚本也终止),break终止循环(执行循环下面的任务),continue终止当前循环
编写脚本求和
![](https://i-blog.csdnimg.cn/blog_migrate/6fcbb8a261ced06ea5ac58170bb40767.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7399572e3b96c04837aa1eb80969c025.png)
case分支结构:如果与预设的值相匹配,则执行对应的操作
![](https://i-blog.csdnimg.cn/blog_migrate/5bf1ff274837a256fc253d5c0a03f1a9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c568406d289a2a96fffacc6a56ed598d.png)
使用脚本安装Nginx(源码编译安装)
![](https://i-blog.csdnimg.cn/blog_migrate/3fab3ba40337b36ce5870885a39244ef.png)
编写脚本安装依赖项、进入目录、配置、编译、安装
![](https://i-blog.csdnimg.cn/blog_migrate/30e857bad722abc30c9b20ae404b5d7d.png)
执行该脚本,查看/usr/local/nginx目录安装成功
![](https://i-blog.csdnimg.cn/blog_migrate/752f3d8d0719d9404da6c9dab2a03400.png)
先关闭http服务防止冲突,然后开启和关闭Nginx服务
![](https://i-blog.csdnimg.cn/blog_migrate/01b3829df1e6de3b2fe54487925830fa.png)
编写脚本来控制Nginx服务启动停止
![](https://i-blog.csdnimg.cn/blog_migrate/3bf31c14629d08e0623f7e6c8b83ecd5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/80a62056b002788c24bfeb967ad4ee70.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d6ae7e73f5fa511b4a2a99144bd2e866.png)
添加重启,查看状态服务
netstat查看端口:-n以数字格式显示端口号,-t显示tcp连接的端口,-u显示udp连接的端口,-l显示服务正在监听的端口信息如httpd启动后一直监听80端口,-p显示监听端口的服务名称是什么
![](https://i-blog.csdnimg.cn/blog_migrate/9d5c0699a5635309ab1bceca3caf0d74.png)
编写脚本
![](https://i-blog.csdnimg.cn/blog_migrate/582e90415fb18f87d96a1bcb9ef9f784.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9fb9f53b6acbdbf3e2cd4f90791ffde3.png)