Shell脚本1
一、编制第一个shell脚本
Shell脚本的作用1:实现了"批量处理"的自动化过程
1.当前系统所支持的shell脚本种类
2.创建第一个脚本文件
新建first.sh文件
脚本里写三条命令
切换到/boot目录
打印当前路径
以人可读的形式将以vml开头的文件以长格式显示出来
添加可执行权限
执行此脚本文件后,输出结果与依次单独执行这三条命令是相同的
直接运行脚本文件
一个合格的shell脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更加容易读懂
#!/bin/bash是一行特殊的脚本声明表示此行以后的语句通过/bin/bash程序来解释执行,其他以#开头的语句表示注释信息,echo用于输出字符串,使脚本的输出信息更通俗易懂
执行脚本的三种方式
1) ./脚本名,要求文件本身具有x可执行权限,外部不会收到影响
2) sh 脚本名,通过/bin/sh来解释脚本,外部不会收到影响
3) . 脚本名 通过点号来执行脚本,使用这个方式,外部将会跟着脚本文件走
4) source 脚本名 通过命令source加载脚本,使用这个方式,外部将会跟着脚本文件走
二、重定向与管道操作
1.重定向操作
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
重定向输出
>:覆盖文件 >>:追加文件
单独执行一个命令,输出结果会显示在屏幕上
使用>,可以把输出结果保存在指定文件中,如果文件不存在,则会新建该文件
但是再使用>将输出结果保存到同一文件中,文件原先的内容将会被覆盖
如果要保存文件原先内容,并将之后的输出结果保存在文件中(即追加),就要使用>>
重定向输入
含义:将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入
为用户设置密码,正常输入需要输2次密码,使用<自动完成密码设置
创建一个文件,添加初始密码为abc123
使用—stdin识别标准输入
从pass.txt文件中取密码
错误重定向
使用2>,2时错误文件的编号,使用标准输出和标准输入重定向时,省略了1,0编号
正常显示结果
显示结果保存到文件里
2.管道操作
检索/etc/passwd文件以/bin/bash结尾的内容
awk 提取字符串
以冒号:作为分隔,输出第一个,第七个区域的字符串,-F指定分隔符号,未指定时(-F也不要)以空格或制表符分隔
查看磁盘分区使用情况
提取根分区(/)的磁盘使用率信息
检索df -hT输出结果中以/结尾的内容,并提取第6个字符串
三、使用shell变量,自定义变量
1.定义新的变量
基本格式:变量名=变量值
2.查看和引用变量的值
对于未定义的变量,将显示为空值;当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号{}将其括起来,否则将无法确定正确的变量名称
3.变量赋值的特殊操作
双引号
定字符串,赋值内容含空格
使用$可以引用其他变量的值(变量引用)
单引号
不再引用其他变量的值,任何字符均作为普通字符看待,赋值内容包含单引号(')时,需使用\'进行转义,避免冲突
反撇号
用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量,反撇号内必须是能够执行的命令行,否则出错
以人可读的形式将which useradd的输出结果以长格式显示出来
which useradd 查看useradd命令的存放位置
提取vsftpd服务的禁止登录用户列表,并将其赋值给变量DenyList
$()实现嵌套命令替换操作
查看useradd命令的存放位置
查询提供useradd命令程序的软件包
查询提供useradd命令程序的软件包所安装的配置文件位置
read命令
用来提示用户输入信息,实现简单的交互过程
格式:read 变量名
输入变量值
等待用户输入文字,并将输入的内容赋值给变量English
read结合-p选项来设置提示信息
提示用户输入需要学习的单词,并将输入的信息赋值给变量English
4.设置变量的作用范围
新定义的变量只在当前的shell环境中有效,即局部变量,当进入另一个shell环境时,局部变量将无法再使用
查看当前定义的变量值
进入子shell环境
无法调用父shell环境中的变量
返回原有的shell环境
export将指定的变量导出为全局变量
查看当前定义的变量值
将English设为全局变量
进入子shell环境
可以调用父shell的全局变量
返回原有的shell环境
用export导出为全局变量的同时,也可以为变量进行赋值
新建一个名为English的全局变量,赋值Chinese
5.数值变量的运算
格式:expr 变量1 运算符 变量2 [运算符 变量3]……
+:加法运算
-:减法运算
\*:乘法运算,只写*会被当成通配符
/:除法运算
%:求模运算,又称取余运算,计算相除后的余数
设置X=35,Y=16两个变量,演示X,Y的加减乘除模
将运算结果赋值给其他变量
先算乘除后算加减
先算括号再算剩下
四、特殊的shell变量
1.环境变量
用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等
Env可以查看到当前工作环境下的环境变量
用grep -v反转,可以忽略掉不必要看得信息
SHELL用户当前登录环境
HISTSIZE命令历史条数
SSH_CLIENT ssh客户端登录终端
USER用户名
MAIL邮件存放目录
PATH命令搜索路径
PWD当前目录
LANG语言和字符集
HOME当前用户宿主目录
LOGNAME当前用户名
希望直接通过文件名称来运行脚本
确认脚本位置
查看当前搜索路径
直接执行时找不到命令
将/root添加到搜索路径
查看修改后的搜索路径
直接以文件名运行脚本
环境变量的全局配置文件为/etc/profile,用户独立配置文件/用户宿主目录/.bash_profile
记录的历史命令条数默认为1000
将记录的历史默认条数改为50
2.位置变量
例:ls -l -h中ls是命令名,即$0,-l是第一个位置变量,即$1,-h是第二个,即$2
编写一个加法运算的脚本add.sh,用来计算两个整数的和
为脚本文件添加可执行权限
$1为1,$2为1
$1为2,$2为3
3.预定义变量
$#:表示命令行中位置参数扥个数
$*:表示所有位置参数的内容
$?:表示前一条命令执行后的返回状态,0执行正确,非0异常
$0:表示当前执行的脚本或程序的名称
编写一个创建目录的脚本
创建了123
编写一个删除目录的脚本
删除了123
Shell脚本与计划任务
1.确定备份方案
备份主机:192.168.10.3,真机192.168.10.1通过finalshell建立ssh连接连接到目标主机
数据库服务器:192.168.10.3,MySQL服务监听的端口为3306
备份内容:将MySQL服务器中的wujiguo库进行备份每天凌晨02:00执行,将库备份为独立的.sql文件,然后压缩为.tar.gz格式,文件名中嵌入执行备份时的日期和时刻
创建用户wang,并对其赋予select查询,lock tables锁定表权限
从备份主机测试数据库访问,查询授权等是否有效
2.编写MySQL备份脚本
创建备份目录
时间格式:YYYYmmdd-HHMM
添加执行权限
手动执行备份脚本
确认备份结果
3.设置计划任务
将脚本转移至备份目录
在00:15执行脚本程序
查看crond运行状态,确保其已运行
再次执行(因为之前的备份文件被手动删除了)
时间到了,备份了02:00的
Date同步时间
显示系统时间
hwclock命令 (即hardwareclock系统硬件时间)#hwclock
显示硬件时间
#hwclock -w
将系统时间写入到系统硬件当中
ntpdate
ntpdate 是一个linux时间同步服务软件,具体的详细资料请参考下百度,有很多详细的资料
查看本机是否安装ntpdate服务,如果没有安装,请 yum install -y ntpdate
同步时间
输入ntpdate time.nist.gov同步网络时间
结果:3 Jun 15:42:39 ntpdate[4721]: adjust time server 211.115.194.21 offset -0.005885 sec
出现上述结果代表时间同步成功,上面的大致意思为调整时间为服务器211.115.194.21的时间,相差-0.005885秒的时间
如果上面time.nist.gov服务器同步不了,可以换下面几个时间服务器试试: time.nist.gov
time.nuri.net
0.asia.pool.ntp.org
1.asia.pool.ntp.org
2.asia.pool.ntp.org
3.asia.pool.ntp.org
同步时间成功后调整硬件时间
#hwclock -w
执行成功后, 查看系统硬件时间(不出意外的话,现在date和hwclock现实的时间均为internet时间)#date
#hwclock
执行上述命令,显示的时间应该一样的
定时执行时间同步任务,所以我们利用crontab -e 来添加定时任务
/1 ntpdate time.nuri.net;hwclock -w
即:#每隔一个小时同步一下internet时间,并写入硬件