一,Shell的语法
#!/bin/bash 开头
eg: vim myshell.sh
#!/bin/bashecho "hello word" # 输出hellowordecho "path=$PATH"echo "home=$HOME"echo "user=$USER"NAME=zhnagqinagecho "name=$NAME"unset NAMEecho "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 200echo "$*" #输出 100 200echo "$@" #输出 100 200echo "参数个数=$#" #输出 参数个数=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/bashif [ $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/bashcase $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/bashfor i in "$*"doecho "the num is $i"doneecho "-----------------------------------------"for j in "$@"doecho "my num is $j"doneecho "===================================="SUM=0for((x=1;x<=100;x++))doSUM=$[$SUM+$x]doneecho "sum=$SUM"########## 结果#############the num is 1 2 3 4-----------------------------------------my num is 1my num is 2my num is 3my num is 4====================================sum=5050
10,流程掏 while
while [ 条件判断式 ]
do
程序
done
eg:./while.sh 100
#!/bin/bashSUM=0i=0while [ $i -le $1 ]doSUM=$[$SUM+$i]i=$[$i+1]doneecho "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 "请输入第一个数" n1read -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 $DATETIMEecho "=============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 $BACKUPtar -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.logecho $DATETIME >> "$LOGFILEPATH"echo "=============mysql开始备份==========" >> "$LOGFILEPATH"echo "=============备份路径:$BACKUP/$DATETIME.tar.gz=========" >> "$LOGFILEPATH"#主机 127.0.0.1HOST=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 $BACKUPtar -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
