shell解释器:在Linux内核与用户之间的解释器程序。通常指/bin/bash,负责向内核翻译及传达用户/程序指令,相当于操作系统的“外壳”。
交互式(命令行):人工干预、智能化程度高,逐条解释执行、效率低
非交互式(脚本):需要提前设计、智能化难度大,批量执行、效率高,方便在后台静悄悄的运行
常见的shell解释器:/etc/shells文件
不同的解释器的风格不一样
相较于其他解释器,bash有很多优点如tab键、历史命令、别名、管道、重定向、上下左右键等。
shell脚本:提前写好可执行语句,能够完成特定任务的文件,顺序、批量化处理
脚本的编写规范:
1、脚本的声明(声明使用那种解释器):#!/bin/bash
2、注释信息:#脚本功能变量作用等信息
3、执行指令:ls cd
创建测试脚本
第一种执行方式:给执行文件添加x权限,以相对路径和绝对路径执行
登录root进入bash创建子进程bash(脚本声明的)执行脚本命令echo(声明的bash解释器执行echo),执行完后会自动退出
第二种执行方式:使用解释器执行,无需x权限
登录root进入bash创建子进程bash(自己开的)执行脚本命令echo(自己开bash解释器执行echo,在脚本文件中没有声明解释器也能执行),执行完后会自动退出
第三种执行方式:使用source或者 . 执行脚本,无需x权限
登录root进入bash执行脚本命令echo-->使用系统的解释器执行,执行完后不会退出
当使用bash和source执行脚本时结果不一样
使用source命令执行,此时命令执行完成,并且cd进入到创建的目录
使用bash命令执行后虽然命令完成了,当并没有进入到该目录
因为bash使用的是自己开的解释器,执行完脚本后就会退回出到系统的bash解释器,而source使用的就是系统的bash解释器,执行完脚本后不会退出。
使用shell脚本搭建yum仓库
此时该yum文件就创建成功
列二搭建网站,&>重定向标准、错误输出到/dev/null
变量:使用固定的名称存放可能发生变化的值,可以提高脚本的灵活度、适应力。
定义赋值变量:
变量种类:
1,自定义变量,由用户自己修改及使用,《变量名=变量值》名称可以用数字、字母、下划线,不能用数字开头,等号两边不能空格,使用unset 变量名(或者变量名=空),取消变量
加上大括号防止和后面的常量混合
2,环境变量,系统自己定义的,变量名通常大写,由系统维护用来设置工作环境,只有个别变量用户可以直接修改,常见的环境变量有:$USER、$UID、$HOME、$SHELL、$PWD、$HOSTNAME、$PS1(一级提示符)、$PS2(二级提示符)、$PATH(存储命令的路径)
env命令:查看所有环境变量
3,位置变量与预定义变量
$1:执行脚本时后面第一个位置参数
$2:执行脚本时后面第二个位置参数
$3:执行脚本时后面第三个位置参数
$*:执行脚本时后面所有位置参数
$#:执行脚本时后面位置参数的个数
$$:当前程序的进程号
$?:判断上一条指令是否执行成功,0成功,非0失败
编写脚本创建用户并设置密码
输入位置变量
set命令:查看所有变量
声明全局变量,export 变量名,当新开一个解释器也能使用该变量
扩展赋值操作:
双引号 “ ”:允许扩展,以$引用其他变量
单引号 ‘ ’:禁用扩展,即使$也视为普通字符
反撇号 ` `:将命令的执行输出作为变量值(或者$( ) )
read标准输入取值:read [-p “提示信息”] 变量名
变成交互式脚本
stty -echo 屏蔽回显,关闭终端输出无显示
stty echo:恢复终端输出
此时输入密码不会显示在屏幕上
整数基本运算:1、expr:计算指定的表达式,并输出结果
2、$[ ]:计算结果替换表达式本身,可结合echo命令输出,引用变量可省略$符号,或者使用$(())
3、使用let命令,不输出结果,专门用于变量的创建和变量的自增减
使用bc实现小数运算
条件测试:赋予脚本智能判断的能力,1,test 表达式,2,[ 表达式 ] 表达式两边空格
1,对字符串测试。成功返回0,不成功返回非0
==:两边相等
!=:两边不相等
-z:字符串的值为空,因为没有c变量所有为空
-n:字符串的值不为空
逻辑组合:条件测试 && 指令(条件成功才执行指令),条件测试 || 指令(条件失败才执行指令)
当执行多个逻辑时A && B && C,A && B必须两个都成功才能执行下一个&& C
整数值比较:-eq 是否相等,-ne是否不等,-ge是否大于或等于,-le是否小于或等于,-gt是否大于,-lt是否小于。
编写脚本,每两分钟查看用户数量,如果发生变化则发邮件给管理员
创建新用户此时会发送邮件给root
把该脚本添加到计划任务中
此时如果添加用户会每两分钟发送邮件
可以删除/var/spool/main/root文件,清空邮件
文件状态测试:-e 判断对象是否存在,若存在则为真,-d 判断对象是否为目录。-f 判断对象是否为一般文件,-r 判断对象是否有可读权限,-w 判断对象是否有可写权限,-x 判断是否可执行
if选择语句:
1、单分支结构:当“条件成立”时执行命令序列,否则不执行任何操作
此时只有当root执行该命令时才会输出信息
2、双分支结构:当“条件成立”时执行命令1序列,否则执行命令2序列
此时当不是root时会提示信息
编写ping脚本
或者使用交互式命令
3、多分支结构:相当于if语句嵌套,针对多个条件分别执行不同的操作。
循环结构:
1、for循环:根据变量的不同取值,重复执行命令序列
如果采用变量,{1..$a}内的变量系统只会翻译一次,把$a翻译为{1..10},不会展开输出10次
需要使用 seq命令展开变量
①编写批量创建用户脚本
首先创建存放用户名称文件
②编写ping很多ip地址
for的C语言风格
2、while循环:反复测试条件,只要成立就执行命令序列
exit可以终止循环(脚本也终止),break终止循环(执行循环下面的任务),continue终止当前循环
编写脚本求和
case分支结构:如果与预设的值相匹配,则执行对应的操作
使用脚本安装Nginx(源码编译安装)
编写脚本安装依赖项、进入目录、配置、编译、安装
执行该脚本,查看/usr/local/nginx目录安装成功
先关闭http服务防止冲突,然后开启和关闭Nginx服务
编写脚本来控制Nginx服务启动停止
添加重启,查看状态服务
netstat查看端口:-n以数字格式显示端口号,-t显示tcp连接的端口,-u显示udp连接的端口,-l显示服务正在监听的端口信息如httpd启动后一直监听80端口,-p显示监听端口的服务名称是什么
编写脚本