shell编程
- shell编程
- shell脚本
- 函数
- 数据库备份
shell编程
对于后端开发,掌握shell编程是非常有必要的,可以对服务器进行维护,同时也可以对数据库进行操作
shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求来运行的界面级程序,用户可以通过shell来启动,挂起,停止,编写一些程序
shell脚本
脚本必须以#!/bin/bash开头
脚本要运行必须需要可执行性权限
- shell变量
Linux系统shell的变量分为,系统变量和用户自定义变量
系统变量:$HOME
,$PWD
,$SHELL
,$USER
set
:显示系统中的变量
如何在shell中定义变量:
定义变量:变量名=值
撤销变量:unset 变量
声明静态变量:readonly变量
注意:静态变量不能够通过unset
撤销
变量名称可以由字母,数字和下划线组成,但是不能一数字开头
等号两边不能有空格
A=date
:是将单词date赋予A,而如果date
上加上反引号就是将date命令运行的结果赋予给A
A=$(date)
:将date命令执行完成后的结果赋予给A
- 如何设置环境变量
export 变量名=变量值
:将shell变量输出为环境变量(全局变量)
source 配置文件
:让修改后的配置文件立即生效
echo $变量名
:查询环境变量的值
/etc/profile
:系统环境变量的配置文件
- shell脚本的多行注释
:<<! 内容 !
:用来注释多行内容
- 位置参数
命令行输入的参数通过位置参数来进行操作
$n
:n为数字,$0代表命令本身,$1-$9代表第一个到第九个参数
${10}
:十以上的参数通过大括号{}
来进行标定
$*
:这个变量表示命令行中所有的参数,将所有的参数看成一个整体
$@
:同样表示命令行所有的参数,不过把每个参数区分对待
$#
: 表示命令行中所有参数的个数
- 预定义变量
$$
:当前进程的进程号
$!
:后台运行的最后一个进程的进程号
$?
:最后一次执行的命令的返回值,返回0表示执行正确,反之执行错误
- 运算符
进行运算:$((运算式))
,$[运算式]
,expr m + n
注意:expr运算符之间又有空格,将expr预算结果进行赋值时需要加上反引号
在expr中加减乘除,取余都可以进行操作
注意:在expr中乘号*
需要用\*
来替代
- 条件判断
[condition]
(注意condition前后不要有空格)
非空返回true,可使用$?
验证
字符判断条件:
=
:字符串比较
整数之间的比较:
符号 | 意义 |
---|---|
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
按照文件执行权限比较:
符号 | 意义 |
---|---|
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
按照文件类型进行判断:
符号 | 意义 |
---|---|
-f | 文件存在并且是一个常规文件 |
-e | 文件存在 |
-d | 文件存在并是一个目录 |
实例if语句:
if [ "ok"="ok" ] //if表示语句开始then echo "s"
fi //fi表示判断语句的结束
if [ 2 -ge 1 ]then echo "大于"
fi
条件分支语句:
if [ 74 -ge 60 ]then echo "及格"
elif [ 74 -lt 60 ]then echo "不及格"
fi
- case语句
case $变量名 in
"值1")
:如果变量值等于值1,则执行程序1
;;
"值2")
:如果变量值等于值2,则执行程序2
;;
esac
- for循环
for 变量 in 值
do
程序代码
done
在for循环中如果使用$*
:将以整体的形式一次性输出
$@
:将是以分个的形式一个一个输出
SUM=0
for((i=1;i<=100;i++))
doSUM=$[$SUM+$i]
done
- while循环
while [条件判断式]
do
程序
done
案例:从命令行输入一个数n,统计1加到n的值
SUM=0
i=0
while [ $i -le $1 ]
do SUM=$[$SUM+$i]i=$[$i+1]
done
echo "执行结果=$SUM"
- read读取控制台输入
read (选项) (参数)
选项:
-p
: 指定读取值时的提示符
-t
: 指定读取值时等待的时间(秒),如果没有在指定的时间内输入退出
read -p "请输入一个数" A
echo "输入的数为$A"
在规定时间内输入一个数
read -t 10 -p "请输入一个数" A
echo "你输入的数为$A"
函数
shell编程中的函数分为系统函数和自定义函数
- 系统函数
basename [pathname] [suffix]
:basename命令会删掉所有的前缀包括最后一个’/'字符,然后将字符串返回回来,同时也会将suffix后缀也删掉
basename /home/hont/test.txt .txt
输出下来就是test
dirname 文件绝对路径
:从给定的包含绝对路径的文件名中去除文件名,然后返回目录部分
dirname /home/nihao/test.txt
输出为dirname/home/nihao
- 自定义函数
基本语法:
[function] funname[()]
{Action;[return int;]
}
调用的时候直接: funname [值]
n1=1;
n2=2;
function sum(){sum=$[$n1+$n2]echo "和是$sum"
}sum $n1 $n2
数据库备份
完成一个数据库的备份,要求:
- 每天凌晨2:30备份数据库到 data/backup/db中
- 备份开始和备份结束给出相应的提示信息
- 备份之后要求以备份时间为文件名,并打包
- 在备份的同时,检查是否有10天前备份的数据库文件,如果有将其删除
编写备份数据库的shell脚本:
#!/bin/bash# 备份目录
BACKUP=/data/backup/db
# 当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
# 数据库的地址
HOST=localhost
# 数据库的用户名
DB_USER=root
# 数据库的密码
DB_PW=hlh520521
# 备份的数据库名
DATABASE=aaa# 创建备份目录
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
# 备份数据库
mysqldump -u${DB_USER} -p${DB_PW} -P3306 --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz
# 将文件处理成 tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
#删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm {} \;
echo "备份数据库¥{DATABASE}成功"
完成备份后进行解压
备份数据库部分完成,现在让他每天凌晨2:30备份
创建定时任务完成定时备份