一,Shell的语法

#!/bin/bash 开头
eg: vim myshell.sh

  1. #!/bin/bash
  2. echo "hello word" # 输出helloword
  3. echo "path=$PATH"
  4. echo "home=$HOME"
  5. echo "user=$USER"
  6. NAME=zhnagqinag
  7. echo "name=$NAME"
  8. unset NAME
  9. echo "name1=$NAME"
  10. readonly STATIC_NAME=lisi #定义静态变量
  11. echo "static_name=$STATIC_NAME"
  12. #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

  1. #!/bin/bash
  2. #获取到各个参数
  3. echo "$0 $1 $2" #输出 100 200
  4. echo "$*" #输出 100 200
  5. echo "$@" #输出 100 200
  6. echo "参数个数=$#" #输出 参数个数=2

5,预定义变量

就是shell设计者事先己定义好的变量,可以直接在shell脚本中使用
$$ 当前进程号
$! 后台运行的最后一个进程的进程号
$? 最后一次执行命令的返回状态。如果为0,证明上一个命令正确执行了;如果非0,则证明上一个命令执行不正确

  1. #!/bin/bash
  2. # $$ $! $? 测试
  3. echo "当前进程=$$"
  4. cat start.out & # &表示后台执行
  5. echo "最后的进程号=$!"
  6. 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

  1. #!/bin/bash
  2. if [ $1 -ge 60 ]
  3. then echo "传入参数:$1大于60"
  4. elif [ $1 -lt 60 ]
  5. then echo "传入参数:$1小于60"
  6. fi

8,流程控制 case

case $变量名 in
“值1”)
如果 $变量名=值1,则执行
;;
“值2”)
如果 $变量名=值2,则执行
;;
“*”)
如果 $变量名=其它值(!=值1,值2),则执行
;;
esac
./week.sh 1

  1. #!/bin/bash
  2. case $1 in
  3. "1")
  4. echo "周一"
  5. ;;
  6. "2")
  7. echo "周二"
  8. ;;
  9. *)
  10. echo "其它"
  11. ;;
  12. esac

9,流程控制 for

for 变理 in 值1 2 3…
do
程序
done
eg: ./for.sh 1 2 3 4

  1. #!/bin/bash
  2. for i in "$*"
  3. do
  4. echo "the num is $i"
  5. done
  6. echo "-----------------------------------------"
  7. for j in "$@"
  8. do
  9. echo "my num is $j"
  10. done
  11. echo "===================================="
  12. SUM=0
  13. for((x=1;x<=100;x++))
  14. do
  15. SUM=$[$SUM+$x]
  16. done
  17. echo "sum=$SUM"
  18. ########## 结果#############
  19. the num is 1 2 3 4
  20. -----------------------------------------
  21. my num is 1
  22. my num is 2
  23. my num is 3
  24. my num is 4
  25. ====================================
  26. sum=5050

10,流程掏 while
while [ 条件判断式 ]
do
程序
done
eg:./while.sh 100

  1. #!/bin/bash
  2. SUM=0
  3. i=0
  4. while [ $i -le $1 ]
  5. do
  6. SUM=$[$SUM+$i]
  7. i=$[$i+1]
  8. done
  9. echo "SUM=$SUM"

11,系统函数

basename /home/aaa/test.txt 输出:test.txt
basename /home/aaa/test.txt .txt 输出:test
dirname /home/aaa/test.txt 输出:/home/aaa

12,自定义函数

[ function ] funname[()]{
Action;
[return int;]
}
eg:fun.sh

  1. #!/bin/bash
  2. #计算两个数之和
  3. function getSum(){
  4. SUM=$[$n1+$n2]
  5. echo "sum=$SUM"
  6. }
  7. read -p "请输入第一个数" n1
  8. read -p "请输入第二个数" n2
  9. #调用加法
  10. getSum $n1 $n2

二,MySql备份

1,需求:

每天2:10备份数据库atguiguDB到/data/backup/db,格式:2021-03-03_230201.tar.gz,
删除10天之前的备份数据

  1. #!/bin/bash
  2. #每天2:10备份数据库guli到/data/backup/db,格式:2021-03-03_230201.tar.gz
  3. #删除10天之前的备份数据
  4. #备份路径
  5. BACKUP=/data/backup/db
  6. #当前时间
  7. DATETIME=$(date +%Y-%m-%d_%H%M%S)
  8. echo $DATETIME
  9. echo "=============mysql开始备份=========="
  10. echo "=============备份的路:$BACKUP/$DATETIME.tar.gz========="
  11. #主机
  12. HOST=192.168.31.135
  13. #用户名
  14. DB_USER=root
  15. #密码
  16. DB_PWD=123456
  17. #备份数据库名
  18. DATABASE=guli
  19. #如果备份的路径文件不存,则创建
  20. [ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
  21. #执行数据库备份
  22. mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
  23. #打包
  24. cd $BACKUP
  25. tar -zcvf $DATETIME.tar.gz $DATETIME
  26. #删除临时文件
  27. rm -rf $BACKUP/$DATETIME
  28. #删除10天之前的备份
  29. find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
  30. echo "================备份成功================="

2,实例

  1. #!/bin/bash
  2. #每天夜里2点备份数据库db_dwxc_mall_prod到/data/mysqlbackup/db,格式:2021-03-03_230201.tar.gz
  3. #删除30天之前的备份数据
  4. #备份路径
  5. BACKUP=/data/mysqlbackup/db
  6. #当前时间
  7. DATETIME=$(date +%Y-%m-%d_%H%M%S)
  8. # 开始时间
  9. STARTTIME=$(date +%s)
  10. # 日志位置
  11. LOGFILEPATH=$BACKUP/backup.log
  12. echo $DATETIME >> "$LOGFILEPATH"
  13. echo "=============mysql开始备份==========" >> "$LOGFILEPATH"
  14. echo "=============备份路径:$BACKUP/$DATETIME.tar.gz=========" >> "$LOGFILEPATH"
  15. #主机 127.0.0.1
  16. HOST=localhost
  17. #用户名
  18. DB_USER=root
  19. #密码
  20. DB_PWD=lhk13522581773
  21. #端口号
  22. #DB_PORT=33306
  23. #备份数据库名
  24. DATABASE=db_dwxc_mall_prod
  25. #如果备份的路径文件不存,则创建
  26. [ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
  27. #执行数据库备份
  28. /data/mysql/bin/mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
  29. #打包
  30. cd $BACKUP
  31. tar -zcvf $DATETIME.tar.gz $DATETIME
  32. #删除临时文件
  33. rm -rf $BACKUP/$DATETIME
  34. #删除10天之前的备份
  35. find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
  36. ENDTIME=$(date +%s)
  37. echo "================备份成功=================" >> "$LOGFILEPATH"
  38. TOTALTIME=$(($ENDTIME - $STARTTIME))
  39. echo "总耗时$TOTALTIME秒" >> "$LOGFILEPATH"

定时任务
查看:crontab -l
增加:crontab -e
0 2 * * * /root/dwxc_mysql_backup.sh