Shell脚本学习
参考视频:https://www.bilibili.com/video/av21303002/?p=60
1、 编写第一个脚本文件
- 必须以#! /bin/bash 开头,表示是用bash进行解析脚本的
- shell文件必须有可执行权限 —chmod 744 myShell.sh
- 执行方法:./myShell.sh 也可以绝对路径/home/fongfiafia/shell/myShell.sh 执行
- 多行注释:<<! !
2、shell的变量
-
分类:分为系统变量和用户自定义变量
- 系统变量:$HOME 你可以echo
例子: echo “PATH = $PATH”
例子:set查看当前shell中所有变量
-
定义变量
-
定义变量: 变量 = 值 (等号两边不能有空格)
例子:
A=10
ECHO “A = $A”
-
撤销变量: unset 变量
-
声明静态变量: readonly 不能unset
-
可以把一个变量提升为全局变量
-
-
定义变量的规则
- 和java一样不能数字开头
- 等号两侧不能有空格
- 变量名称一般习惯大写
-
怎么讲运行结果返回给变量
- 反引号:A =
'ls -l /home' - MY_DATE=$(date)
- 反引号:A =
-
设置环境变量
- 例子:etc/profile 里面有一个环境变量,myshell.sh要使用它。必须先执行
source etc/profile 让它生效:
具体写法:在profile下面写:
TOMCAT_HOME=/OPT/XX
EXPORT TOMCAT_HOME
然后保存退出,执行source /etc/profile
这样就可以直接执行echo $TOMCAT_HOME的值
最后我们可以在我们的shell文件中,直接echo $TOMCAT_HOME了
-
读取命令行的参数:就是这种形式:./shell.sh 10 20 其中10,20就是参数
- $n 输出文件名,参数。。。
- $* 输出所有参数,但是参数是一个整体
- $@ 输出所有参数,但是参数之间是分开的
- $# 表示参数个数##
-
预定义变量:shell设计者实现已经定义好的变量。这里介绍了几个
-
$ $ 当前进行的pid
-
$! 后台运行的最后一个进程号pid
-
$?
-
这里的例子写到了一个东西,我在一个脚本里面执行另外一个脚本,要知道一个脚本的执行其实相当于一个进程,在一个脚本中执行,其实就是后台进程。执行的命令方法是:
./myshell.sh &
-
3、运算符:有两种方式
-
$[运算式]
- $[(2+3)*4] 推荐这么写
-
expr m - n 运算符之间要有空格:同时乘法和除法取余数都要加上\
-
写一个例子:计算输入脚本的参数之和:
SUM=$[$1+$2]
4、条件判断
[ condition ] 注意前后都有一个空壳
- 两个整数的比较:(前面的- 也要写)
- -lt 小于 little
- -gt 大于 great
- -le 小于等于
- -ge 大于等于
- = 字符串的比较
- 文件的
- -e 文件是否存在 if [ -e /root/xxx.txt ]
5、流程控制
-
if 判断
- if then fi
- if then elif then fi
-
case语句
-
case $1 in "1") echo "周一" ;; "2") echo "周二" *) -----------相当于default echo "都匹配不上" esac
-
-
for循环
-
for i in “$*” //这个$*是位置变量哦! 他是一个整体哦!! do echo "the num is $i" //这样是只输出一条语句 done 因此其实我们最常用的是 $@ -
for((i=1;i<100;i++)) //在这个上面要先 SUM=0 do sum =$[$sum+$i] done echo "sum=$sum"
-
-
while 后面要加一个空格
从命令行输入一个数n,计算1+2+3+。。。+n
-
while [ $i -lt $1 ] //在这个上面要先 SUM=0 i=0 do sum=$[$sum+$i] i=[$i+1] done echo "$sum"
-
5、读取控制台输入read
- 参数
- read -p “请输入一个数num=” NUM1 //进入阻塞,等待用户输入一个值给NUM1
- read -t 10 -p "请输入一个数num=” NUM1 //进入阻塞,等待用户输入一个值给NUM1,必须在10秒内
6、函数
-
系统函数
- basename 返回完整路径最后的部分“/”后面的内容
-
自定义函数
function getSum(){ SUM=[$n1+$n2] echo "$SUM" } read -p "请输入第一个值" n1 read -p "请输入第二个值" n2 getSum $n1 $n2
7、案例学习
要求:每天凌晨2:10备份数据库ztguiguDB到/data/backup/db中
备份开始和结束能够给出相应的提示信息
备份后的文件要求以备份时间为文件名,并打包成tar.gz形式
在备份的同时,检查是否有10天前备份的数据库文集那,如果有就删除
#!/bin/bash
#备份的路径
BACKUP=/data/backup/db
#获取当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "开始备份,备份的路径是$BACKUP/$DATETIME.tar.gz"
#主机
HOST=localhost
DB_USER=root
DB_PWD="123"
#创建备份的路径
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
DATABASE=atguiguDB
#执行mysql的备份数据库指令
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 {} \;
最后需要建一个进程任务crontab -e
10 2 * * * /home/fongfiafia/shell/mysql_db_backup.sh
来源:CSDN
作者:fongfiafia
链接:https://blog.csdn.net/fongfiafia/article/details/99710586