shell脚本
# shell
#!/bin/bash 开头
声明用是什么 执行
#!/bin/bash
# 内部写Linux命令
单行注释 #
多行注释
:<<!
content..
!
1、变量
定义 A='linux'
变量引用需要在前面加$符号 如:echo "$A" /echo $A
单引号 echo '$A' 变量不会引用
销毁变量 unset A
定义和使用静态变量
readoly A=99
echo '$A' 正常输出
unset A 报错,静态变量不能unset
定义变量规则
1,变量名可以是字母、数字、下划线组合,但不能以数字开头
2,等号两侧不能有空格
3,变量名一般习惯为大写
2、将命令的返回值赋值给变量
命令替换格式:$(cmd)或者`cmd` `为tab上面的反引号
A=`ls-la` `为tab上面的反引号
A=$(ls-la) 和上面的是等价的
命令替换个管道的区别
命令替换是将一个命令的输出作为另外一个命令的参数,
而管道是将命令的输出作为下个命令的标准输入
3、设置环境变量
基本用法
export 变量名=变量值 将shell 变量输出位环境变量
source 配置文件 让修改后的环境变量立即生效
echo $变量名 查询环境变量的值
快速入门
在/etc/profile 文件中定义 环境变量ABC
ABC=/opt/tomac
export ABC
为了让/etc/profile 的环境变量生效,需要使用下面命令
命令 source/etc/profile
或者重启
echo $ABC
/opt/tomac
可以在别的shell脚本中使用了
4、位置参数
基本语法
$n ,n为数字($0代表命令本身,$1-$9代表第一到第九个参数,
10以上的数字需要用大括号包含,如${10})
下面说的所有参数都不带 命令本身
$* 代表所有参数,*把所有的参数看成一个整体
$@ 也代表命令行所有的参数,不过$@把每个参数区分对待
$# 代表命令行所有参数的个数
5、预定义变量
含义:就是shell 设计者事先已经定义好的变量,可以在脚本中直接使用
基本语法
$$ 当前进程的进程号 PID
$! 后台运行的最后一个进程的进程号 PID
$? 最后一次执行的命令的返回状态,如果是 0 代表上个命令执行成果
如果非 0(具体是那个数,由命令自己来决定) 代表执行不正确
示例
#!/bin/bash
echo '当前进程号=$$'
# 后台的方式运行 myshell.sh (&代表后台运行)
./myshell.sh &
echo '最后的进程号=$!'
echo '执行是否成功 $?'
echo $1
./apo/sh dad
输出 dad
echo $* 输出所有参数
6 、运算符
基本语法
a、 $((运算式)) 或者 $[运算式]
b、 expr m + n
注意expr运算符间要有空格
A = `expr m - n` 需要用反引号
c、 expr m - n
d、 expr \* (\是转义符),/,% 乘,除,取余
7、条件判断
基本语法
[ condition ] (注意condition是条件 前后要有空格)
# 非空返回True,可以使用$?验证(0为True, >1 为False)
示例
[ apollo ] 返回 True
[] 返回 False
[ condition ]&& echo ok|| echo notok 条件满足执行后面的
常用的判断条件
a、两个整数的比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
b、按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
c、 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录
案例:
1,‘ok' 是否等于 ’ok‘
if [ 'ok' = 'ok' ]
then
echo 'equal'
fi
# 如果相等输出 ’equal'
2, 23 是否大于等于 22
3, /root/install.log 目录中的文件是否存在
if [ -e /root/install.log ]
then
echo '存在'
fi
if 语法
if [ ]
then
# True 执行这
elif []
then
# True 执行这
fi
流程控制
case
基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
;;
*)
都不是执行此程序
;;
esac
for 循环
语法一
for i in [list]
do
echo $i
done
for i in `seq 10`
do
echo $i
done
语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
while循环
while[ condition ]
do
command...
done
while ls
do
echo 1
done
ls 执行成功打印1
read 读取控制台的输入
基本语法
read[选项](参数)
选项
-p 指定读取值时的提示符
-t 指定读取值时的等待时间(秒),如果没有在指定时间内输入就不等待了。。
参数
指定读取值的变量名
应用实例
1 读取控制台输入一个num值
read -p '请输入一个数num1=‘ num1
echo num1
2 读取控制台输入一个num值,在10秒内完成
read -t 10 -p '请输入一个数num1=‘ num1
echo num1
函数
系统函数
basename 基本语法
功能: 返回完整路径最后/的部分,常用于获取文件名
basenmae [pathname][suffix]
basename /home/aaa/test.txt
test.txt
basename /home/aaa/test.txt .txt
test
basenmae [string][suffix]
删除所有前缀,包括最后一个’/‘字符,然后将字符串显示出来
选项
suffix 为后缀,如果suffix被指定了,basename会将pathname
或者string中的suffix后缀去掉
dirname
和basename 相反,这个是获取路径部分
案例:
返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
/home/aaa
自定义函数
function name( )
{
}
shell 函数可以带function关键字,也可以不带
shell 函数可以加return返回值,也可以不加如果不加就以最后一条命令运行的结果作为返回值
案例:
请计算输入两个数的和
getSum()
{
sum=$[$n1+$n2]
echo '$sum'
}
read -p '请输入n1'n1
read -p '请输入n2'n2
# 调用getSum
getSum $n1 $n2
综合案例
需求分析
1、每天凌晨2:10备份数据库atgulgDB到 /data/backip/db
2、备份开始和备份结束能够给出相应的提示信息
3、备份后的文件要求以备份时间为文件名,并打包成 .tar.gz的形式,比如
2019-03-12_230201.tar.gz
4、在备份的同时,检查是否有10天前的备份的数据库,如果有将其删除
思路
脚本写在 /usr/sbin 下
数据库备份的文件存在 /data/backip/db
将脚本设置到crond(任务调度器)执行
代码实现
vim /usr/sbin/mysql_backup_db.sh
#!/bin/bash
#完成数据库的定时备份
#备份路径
BACKUP=/data/backip/db
# 获取当前时间
DATETIMEN=$(date +%Y_%m_%d_%H%M%S)
echo '======开始备份======'
echo '======备份路径是 $BACKUP/DATETIMEN======'
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
#备份数据库的名
DATABASE='atguiguDB'
# 创建备份路径,如果备份路径文件夹存在就使用,否则就创建
[ ! -d '#BACKUP/$DATETIMEN' ] && mkdir -p '#BACKUP/$DATETIMEN'
# 执行mysql的备份数据库的指令
mysqldump -u${DB_USER} -P$DB_PWD --host=$HOST $DATABASE | gzip > #BACKUP/$DATETIMEN.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIMEN.tar.gz $DATETIMEN
# 删除临时文件
rm -rf $BACKUP/$DATETIMEN
#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*tar.gz" -exec rm -rf {}\;
echo '======备份成功====='
定时执行
crontab -e
10 2 * * * /usr/sbin/mysql_backup_db.sh