shell编程
1.shell编程是个啥
#!/bin/bash echo 'hello world'
代码解释: 1.#!/bin/bash: 告诉计算机,使用bash解释器来执行代码 2.echo: 控制台输出
2.执行代码方式
chmod 744 myshell.sh
然后直接运行脚本
bash myshell.sh
3.注释
#内容
多行注释
:<<!
内容
!
4.变量
1.Linux中变量的分类:系统变量 自定义变量 2.系统变量: $PATH $HOME $PWD $SHELL $USER 3.显示当前shell中所有的变量:set
2.变量的定义
基本语法
1.定义变量:变量名=变量值 2.撤销变量:unset 变量名 3.声明静态变量:readonly 变量名. 静态变量不能unset,不能修改
快速入门
1.定义变量a a=123 echo "a=$a" 打印a=123 2.撤销变量a unset a echo "a=$a" 打印a= (因为unset a 把a撤销了) 3.声明静态变量b=2,尝试unset撤销 readonly b=2 echo "b=$b" 打印b=2
test.sh
运行test.sh
定义规则
1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头 2.等号两侧不能有空格 3.变量名称一般习惯为大写
将命令的返回值赋给变量(用的多)
1.A=`ls -l` 反引号,运行里面的命令,并把结果返回给变量 A a='$A'
2.A=$(ls -l) 等价于反引号
5.设置环境变量
1.export 变量名=变量值 将shell变量输出给环境变量 2.source 配置文件 让修改后的配置信息立即生效 3.echo $变量值 查看环境变量的值
6.位置参数变量
介绍:
1. $n (功能描述:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}) 2. $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体) 相当于字符串 3. $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待) 相当于列表 4. $#(功能描述:这个变量代表命令行中所有参数的个数)
7.预定变量
介绍
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行失败)
8.运算符
1.$((运算式)) 运算符之间不能加空格 2.$[运算式] 3.`expr m + n` 特点:运算符之间要有空格 + - / % \* \( \)
9.判断
基本语法
[ 条件 ] 注意:条件前后要有空格
特别的:
[ 非空 ] 为true
[] 为false
[ haha ] && echo true || echo false
判断语句
字符串比较
= 判等
!= 判不相等
整数比较
-lt 小于 -le 小于等于 -gt 大于 -ge 大于等于 -eg 等于 -ne 不等于
文件权限判断
-r 有读的权限 [ -r 文件 ] -w 有写的权限 -x 有执行权限
文件类型判断
-f 存在并且是一般文件 [-f 文件] -e 文件存在 -d 存在并且是一个目录
快速入门
23 是否大于 23 23 -gt 23 23 是否大于等于 23 23 -ge 23 /root是否存在 [ -e /root ] /root是否是一般文件 [ -f /root ]
10.流程控制
1.if判断
基本语法
if [ 条件 ] 注意[]和条件之间要有空格 then 代码 fi
if [ 条件 ] then 代码 else 代码 fi
if [ 条件 ] then 代码 elif [ 条件 ] then 代码 else 代码 fi
快速入门
编写shell脚本,if.sh: 执行shell命令:bash if.sh 59 如果输入参数,大于等于60,则输出'及格了',如果小于60,则输出'不及格' if [ $1 -ge 60 ] #$1获取执行命令传递的参数 then echo "及格" else echo "不及格" fi
2.case选择分支
case $变量名 in '值1') 代码 ;; '值2') 代码 ;; *) 代码 都没命中执行 ;; esac
3.for循环
for 变量 in 值1 值2 值3 do 代码 done
循环
for ((初始值;循环条件;变量变化)) do 代码 done
4.while循环
while [ 条件 ] do 代码 done
11.与用户交互
基本语法
read 选项 变量 选项: -p:提示信息 -t:等待输入的时间 read -p "输入一些东西" name echo "$name"
12.函数
basename [pathname] [suffix] 获得路径最后一部分 如果指定的suffix,那么会去掉结果中suffix的部分 basename /bin/xxx/yyy/mm.txt .txt 结果:mm
dirname
基本语法
dirname [pathname]
获得基础路径
2.自定义函数
function 函数名(){ 代码; #参数使用:$1,$2,...,${10}... return xxx; } $?是上一条指令的值(可以获取return的值) 调用: 函数名 值1 值2
13.shell综合案例
在/root下编写mysql_db_backuo.sh 需求: 1.每天凌晨2点10分,备份数据库mydb 到/data/backup/db crontab -e 2.备份开始和备份结束时能够给出提示信息 3.备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,如2019-09-28-044403.tar.gz 4.在备份的同时,检查是否有10天前的备份文件,如果有就删除
#!/bin/bash #备份的路径 BACKUP=/data/backup/db #当前的时间作为文件名 DATETIME=$(date +%Y_%m_%d_%H%M%S) echo "=======开始备份======" echo "=====备份的路径是 $BACKUP/$DATETIME.tar.gz" #主机 HOST=localhost #用户名 DB_USER=root #密码 DB_PWD=997997 #备份的数据库 DATABASE=mydb 如果备份路径不存在,就创建 [ ! -d "$BACKUP/DATETIME" ] && mkdir -p "$BACKUP/$DATETIME" #执行mysql的备份指令 mysqldump -u$DB_USER -p$DB_PWD --host=$HOST $DATABASE | gzip > $BACKUO/$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 {} \; echo "=====备份成功+++++"