一,Shell的语法
#!/bin/bash
开头
eg: vim myshell.sh
#!/bin/bash
echo "hello word" # 输出helloword
echo "path=$PATH"
echo "home=$HOME"
echo "user=$USER"
NAME=zhnagqinag
echo "name=$NAME"
unset NAME
echo "name1=$NAME"
readonly STATIC_NAME=lisi #定义静态变量
echo "static_name=$STATIC_NAME"
#nuset STATIC_NAME #静态变量不能重复赋值
1,shell的变量介绍
Linux Shell的变量分为:系统变量,用户变更,自定义变量。
系统变更:$HOME
, $PWD
, $SHELL
, $USER
, $PATH
当前Shell所有变更:set
2,shell变更的定义
变量名称可以由字母,数定,下划线组成,但不能以数字开头,等号两边不能有空格,变量名称一般习惯大写
定义变量:变量=值
撤销变量:unset 变量
静态变量:readonly 变量=值
静态变量不能unset
3,定义环境变量
export 变量名=值
功能:将shell变量输出为环境变量source 配置文件
功能:让修改后的配置信息立即生效echo $变量名
功能:查询环境变量的值
在 /etc/profile
文件中定义TOMCAT_HOME环境变量
让环境变量生效 source /etc/profile
4,位置参数变量
eg:./myshell.sh 100 200 可以在myshell.sh脚本中获取到的参数信息
$n n为数字,$0代表命令本身,$1-$9代表1到第9个参数
$ $ 把所有的参数看成一个整体,把所有的参数看成一个整体
$@ 代表命令行中的所有参数,不过把 $@把每个参数区分对待
$# 每个参数代表命令行中的所有参数的个数
./myshell.sh 100 200
#!/bin/bash
#获取到各个参数
echo "$0 $1 $2" #输出 100 200
echo "$*" #输出 100 200
echo "$@" #输出 100 200
echo "参数个数=$#" #输出 参数个数=2
5,预定义变量
就是shell设计者事先己定义好的变量,可以直接在shell脚本中使用
$$ 当前进程号
$! 后台运行的最后一个进程的进程号
$? 最后一次执行命令的返回状态。如果为0,证明上一个命令正确执行了;如果非0,则证明上一个命令执行不正确
#!/bin/bash
# $$ $! $? 测试
echo "当前进程=$$"
cat start.out & # &表示后台执行
echo "最后的进程号=$!"
echo "执行的值=$?"
6,运算符
1,$((运算式)) RESULT=$(((2+3)*4))
2,$[运算式] RESULT=[(2=3)*4]
3,expr *,/, % (乘除取余) TEMP=
expr 2 + 3`RESULT=`expr $TEMP \* 4
7,条件判断 if
[ condition ] 注:condition 前后有空格
#非空返回 true,可使用$?验证(0为true, >1为false)
实例:
[ atguigu ] 返回 true
[] 返回 false
[ condition ] && echo notok 条件满足,执行后面的语句
常用判断条件
1,整数比较
= 字符
-le 小于
-eq 等于
-gt 大于
-ge 小于
-ne 不等于
2,文件权限判断
-r 有读权限
-w 有写权限
-x 有执行权限
3,文件类型判断
-d 文件存在并是一个目录
-e 文件存在
-f 文件存在并且是一个常规的文件
-n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真
-z string的长度为零则为真
./testif.sh 70
#!/bin/bash
if [ $1 -ge 60 ]
then echo "传入参数:$1大于60"
elif [ $1 -lt 60 ]
then echo "传入参数:$1小于60"
fi
8,流程控制 case
case $变量名 in
“值1”)
如果 $变量名=值1,则执行
;;
“值2”)
如果 $变量名=值2,则执行
;;
“*”)
如果 $变量名=其它值(!=值1,值2),则执行
;;
esac
./week.sh 1
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "其它"
;;
esac
9,流程控制 for
for 变理 in 值1 2 3…
do
程序
done
eg: ./for.sh 1 2 3 4
#!/bin/bash
for i in "$*"
do
echo "the num is $i"
done
echo "-----------------------------------------"
for j in "$@"
do
echo "my num is $j"
done
echo "===================================="
SUM=0
for((x=1;x<=100;x++))
do
SUM=$[$SUM+$x]
done
echo "sum=$SUM"
########## 结果#############
the num is 1 2 3 4
-----------------------------------------
my num is 1
my num is 2
my num is 3
my num is 4
====================================
sum=5050
10,流程掏 while
while [ 条件判断式 ]
do
程序
done
eg:./while.sh 100
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"
11,系统函数
basename /home/aaa/test.txt
输出:test.txtbasename /home/aaa/test.txt .txt
输出:testdirname /home/aaa/test.txt
输出:/home/aaa
12,自定义函数
[ function ] funname[()]{
Action;
[return int;]
}
eg:fun.sh
#!/bin/bash
#计算两个数之和
function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个数" n1
read -p "请输入第二个数" n2
#调用加法
getSum $n1 $n2
二,MySql备份
1,需求:
每天2:10备份数据库atguiguDB到/data/backup/db,格式:2021-03-03_230201.tar.gz,
删除10天之前的备份数据
#!/bin/bash
#每天2:10备份数据库guli到/data/backup/db,格式:2021-03-03_230201.tar.gz
#删除10天之前的备份数据
#备份路径
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
echo "=============mysql开始备份=========="
echo "=============备份的路:$BACKUP/$DATETIME.tar.gz========="
#主机
HOST=192.168.31.135
#用户名
DB_USER=root
#密码
DB_PWD=123456
#备份数据库名
DATABASE=guli
#如果备份的路径文件不存,则创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行数据库备份
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时文件
rm -rf $BACKUP/$DATETIME
#删除10天之前的备份
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "================备份成功================="
2,实例
#!/bin/bash
#每天夜里2点备份数据库db_dwxc_mall_prod到/data/mysqlbackup/db,格式:2021-03-03_230201.tar.gz
#删除30天之前的备份数据
#备份路径
BACKUP=/data/mysqlbackup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
# 开始时间
STARTTIME=$(date +%s)
# 日志位置
LOGFILEPATH=$BACKUP/backup.log
echo $DATETIME >> "$LOGFILEPATH"
echo "=============mysql开始备份==========" >> "$LOGFILEPATH"
echo "=============备份路径:$BACKUP/$DATETIME.tar.gz=========" >> "$LOGFILEPATH"
#主机 127.0.0.1
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=lhk13522581773
#端口号
#DB_PORT=33306
#备份数据库名
DATABASE=db_dwxc_mall_prod
#如果备份的路径文件不存,则创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行数据库备份
/data/mysql/bin/mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时文件
rm -rf $BACKUP/$DATETIME
#删除10天之前的备份
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
ENDTIME=$(date +%s)
echo "================备份成功=================" >> "$LOGFILEPATH"
TOTALTIME=$(($ENDTIME - $STARTTIME))
echo "总耗时$TOTALTIME秒" >> "$LOGFILEPATH"
定时任务
查看:crontab -l
增加:crontab -e0 2 * * * /root/dwxc_mysql_backup.sh