[TOC]目录
目录生成脚本地址://www.greatytc.com/p/caa21e6796bd
一、Linux中Shell
1、Shell是什么
Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,可以用Shell来启动、挂起、停止、编写一些程序。
2、Shell脚本的执行方式
脚本格式要求
- 脚本以 #!/bin/bash 开头
- 脚本需要有 执行权限
范例
#!/bin/bash
echo "hello world!"
执行方式
- 方式一
- 给 xx.sh 赋予 +x 的权限
- 执行脚本
- 方式二
- sh xx.sh
1.Shell变量
- 变量分为:系统变量和自定义变量。
- 系统变量:【$HOME]、$PWD 、$USER 等 : 区分大小写
- 显示当前 shell 中所有变量 : set
定义
- 定义变量:变量=值
- 撤销变量:unset 变量
- 申明静态变量:readonly 变量, 不能执行 unset
2.变量定义规则
- 变量由 字母、数字、和下划线组成,不能以 数字开头。
- 等号两侧不能有空格
- 变量名称一般大写
==使用 ``==
A=`ls -la` :把执行结果 返回给变量 A
====================
A=$(ls -la)
3.设置环境变量
- export 变量名=变量值:将shell变量输出为环境变量
- export 配置文件:让修改后的配置文件生效
- export $变量名:查询环境变量的值
位置参数变量
0 代表 命令本身;$1 – $9 :第一个到第九个参数,10及以上的参数,用 ${10}
$* :代表命令行中的所有参数, 看成一个整体
$@ :代表命令行中的所有参数,会把每个参数区分开
$# :代表命令行中所有参数的个数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"
================
./position.sh 30 60
30 60
30 60
参数个数=2
预定义变量
Shell中已经定义好的变量,可以直接使用
$$:当前进程的PID
$!:后台运行的最后一个进程的PID
$?:最后一次执行的命令的返回状态。如果为0,表示上一个命令正确执行。
4.Shell运算符
[运算符]
expr m + n : 运算符之间 有空格
expr m - n
计算 (2+3)*4
#!/bin/bash
echo "hello"
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
RESULT2=$[(2 + 3) * 4]
echo "result2=$RESULT2"
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"
5.Shell判断语句
[ condition ] :condition前后有空格
- [ 1 ] :true
- [] : false
- [ condition ] && echo 123 || echo 234
6.常用判断条件
- 数字的比较
= | 字符串比较 |
---|---|
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等 |
- 按照文件权限判断
-r | 有读的权限 |
---|---|
-w | 有写的权限 |
-x | 有执行的权限 |
- 按照文件类型判断
-f | 文件存在并且是一个常规文件 |
---|---|
-e | 文件存在 |
-d | 文件存在且是一个目录 |
3、Shell流程控制
If 语句
if [ condition ]
then XXX
elif [ condition ]
then xxx
fi
示例
if [ "ok" = "ok" ]
then echo "ok==ok"
fi
if [ 23 -gt 22 ]
then echo "gt"
fi
if [ -e /root/shell/aaa.txt ]
then echo "exist"
fi
case 语句
case $变量名 in
"值1")
echo "aaa";;
"值2")
echo "bbb";;
*)
echo "ccc";;
esac
#!/bin/bash
case $1 in
"1")
echo "aaa";;
"2")
echo "bbb";;
*)
echo "ccc";;
esac
------------------
./xx.sh 1
for 语句
for 变量 in 值1 值2 值3 ....
do
xxxx
done
for ((初始值; 循环控制条件;变量变化))
do
xxxx
done
示例
for i in "$*"
do
echo "num is $i"
done
# 只会打印一次,所有参数当成一个
===================
for j in "$@"
do
echo "num is $J"
done
# 多个参数会打印多行
#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
while语句
while [ condition ]
do
xxxx
done
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"
Shell输入输出
read (选项)(参数):从控制台读取数据
-p:指定读取值时的提示符
-t:指定读值的等待时间【单位:秒】,超时不等待
参数:指定读取值的变量名
#!/bin/bash
read -p "input a number:" NUM1
echo "num1=$NUM1"
read -t 5 -p "在5秒内,输入一个数num=" NUM2
echo "num=$NUM2"
Shell函数
系统函数
1)basename:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename /home/aaa/test.txt => test.txt
basename /home/aaa/test.txt .txt => test
2)dirname:返回完整路径最后 / 的前面部分,常用于获取路径
dirname 文件绝对路径
diename /home/aaa/test.txt ==>/home/aaa
自定义函数
语法
[function] funcName[()]
{
action;
[return int;]
}
示例
function getSum() {
SUM=$[$n1 + $n2]
echo "sum=$SUM"
}
read -p "first num1=" n1
read -p "second num2=" n2
getSum $n1 $n2
案例
需求:
- 每天凌晨 2 点 0分,备份数据库 testdb 到 /data/backup/db
- 备份开始和结束给出提示信息
- 备份好的文件要求以 备份时间为文件名,并打包 .tar.gz 格式:2019-02-23-09-02-01.tar.gz
- 同时检查 是否有超过10天的备份文件,有就执行删除操作
# 数据库定时备份 脚本
BACKUP_PATH=/data/backup/db
DATETIME=$(date +%Y-%m-%d-%H-%M-%S)
# echo "date=$DATETIME"
echo "========备份开始========="
echo "========备份路径=$BACKUP_PATH/$DATETIME.tar.gz==========="
HOST=localhost
USER=root
PWD=root
DB=testdb
# 如果路径不存在就新建
[ ! -d "$BACKUP_PATH/$DATETIME" ] && mkdir -p $BACKUP_PATH/$DATETIME
# 执行备份命令
mysqldump -u$USER -p$PWD --host=$HOST $DB | gzip > $BACKUP_PATH/$DATETIME/$DATETIME.sql.gz
cd $BACKUP_PATH
tar -zcvf $DATETIME.tar.gz $DATETIME
# 删除临时文件
rm -rf $BACKUP_PATH/$DATETIME
# 找10天前文件,并删除
find $BACKUP_PATH -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
# 输出备份结束信息
echo "==========备份成功==========="
- crontab -e
- 0 2 * /xxx.sh
二、Linux定时任务调度
crond任务调度
系统在某个时间段执行特定的命令或程序。
1、数据库的定时备份操作。
2、系统一些重复工作,病毒扫描等。
用法
crontab 【选项】
-e:编辑crontab定时任务
-l:查询crontab任务
-f:删除当前用户所有的crontab任务
-r:终止任务调度
service crond restart:重启任务调度
crontab -e
*/1 * * * * ls -l /etc > /tmp/to.txt -- 每小时的每分钟执行
- 第一个*:一小时中的第几分钟【0-59】
- 第二个*:一天中的第几个小时【0-23】
- 第三个*:一个月当中的第几天【1-31】
- 第四个*:一年中的的第几月【1-12】
- 第五个*:一周当中对的星期几【0-7 0和7都表示 周日】
特殊符号 | 说明 |
---|---|
* | 代表任意时间 |
, | 不连续的时间范围,0 8,12,15 *,每天8、12、15点执行。 |
- | 连续的时间范围,0 5 1-6,周一到周六的凌晨5点执行。 |
*/n | 每隔多久执行一次,/10 *,每隔10分钟执行一次。 |
示例
示例 | 含义 |
---|---|
45 22 * | 每天22点45分执行 |
0 17 1 | 每周一的17点0分执行 |
0 5 1,15 | 每月1、15号的凌晨5点0分执行 |
40 4 1-5 | 每周一到周五凌晨4点40分执行 |
/10 4 | 每天凌晨4点,每隔10分钟执行一次。5点就不执行了 |
0 0 1,15 * 1 | 每月1、15号、每周一的0点0分执行 |
实际操作
1、每隔1分钟,当前日期信息,写入 文件中。
- vim /home/wsw/mytask1.sh
- date >> /home/wsw/dates.txt
- 给mytask1.sh 执行权限
- chmod 744 /home/wsw/mytask1.sh
- crontab -e
- /1 * /home/wsw/mytask1.sh
2、每天凌晨2点,mysql数据库 testdb、备份。
- vim /home/wsw/mytask2.sh
- /usr/local/mysql/bin/mysqldump -u root -proot testdb > /tmp/db.bak
- chmod 744 /home/wsw/mytask2.sh
- crontab -e
- 0 2 * /home/wsw/mytask2.sh