Shell编程
基础语法
-
脚本格式
-
!/bin/bash 固定开头标识
- 文件后缀.sh
- 单行注释#
- 多行注释:<<! 换行 代码 换行 !
-
-
执行脚本
- 脚本需要赋予可执行权限:chmod u+x 脚本文件路径,直接执行脚本
- 不用赋予执行权限,直接使用命令:sh 脚本文件路径
-
变量定义
-
系统变量:系统中常驻的环境变量
- echo 可以打印一些变量值,如:echo $HOME $PATH
- set 可以打印所有的系统变量查看
- 规则
- export 变量名=变量值 将shell变量输出为环境变量/全局变量
- source 配置文件 让修改后的配置信息立即生效(统一配置在/etc/profile文件)
- echo $变量名 查询环境变量的值
-
用户自定义变量
-
位置参数变量
获取执行脚本时输入的携带参数
- $n n为数字,从0位置开始获取,0为命令本身字符串,当n大于1位时记得使用${10}来取值
- $* 获取所有携带参数,不带命令,把参数当成一个整体
- $@ 获取所有携带参数,不带命令,把参数区分对待,可用于循环
- $# 获取所有携带参数的个数
-
预定义变量
shell设计者预先定义好的变量
- $$ 获取当前进程-进程号-PID
- $! 后台运行的最后一个进程的进程号(PID)
- $? 最后一次执行的命令的返回状态,如果变量为0,证明上个命令正确执行,非零不正确执行,具体非零值由命令自己决定
-
-
运算符
- 基本语法
- "$((运算式))" 或 "$[运算式]" 或者 expr m + n
- 如果使用expr运算符间要有空格,如果希望expr的结果赋给某个变量,使用反引号括起来,同时expr运算一般分布运算,一次做一个加减乘除
- + 假发 - 减法 \* 乘法 / 除法 % 取余
- 基本语法
-
条件判断
- 基本语法
- [ condition ] 注意condition前后有空格(非空为真,$?进行验证的时候,0为真)
- 应用
- [ szl ] 返回true
- [] 返回false
- [ condition ] && echo OK || echo notOK 条件condition为真执行&&后面语句,不满足执行||后面语句
- 常用判断条件
- 字符串比较
- =
- 两个整数比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 文件权限判断
- -r 有读取的权限
- -w 有写的权限
- -x 有执行权限
- 文件类型判断
- -f 文件存在且是一个常规文件
- -e 文件存在
- -d 文件存在并是一个目录
- 应用
- “ok” 是否等于 “ok” 使用 =
- 23是否大于等于22 使用 -ge
- /root/shcode/aaa.txt目录的文件是否存在 使用-f
- 字符串比较
- 基本语法
-
流程控制
-
分支:
#单分支 if [ condition ] then echo "执行代码" fi #多分支 if [ condition ] then echo "执行代码1" elif [ condition ] then echo "执行代码2" fi #case语句 case $变量名 in "值1") echo "执行代码1" ;; "值2") echo "执行代码2" ;; *) echo "都不满足执行" ;; esac
-
循环
#方式1 for 变量 in 值1 值2 值3... do 程序 done #如循环输出 for i in "$@" do echo "num is $i" done ------------------------------------- #方式2 for((初始值;循环控制条件;变量变化)) do 程序 done #如求和 SUM=0 for((i=1;i<=100;i++)) do SUM=$[$SUM+$i] done echo "sum=$SUM" ------------------------------------- #while循环 while[ condision ] do 程序 done #如根据输入数据求和 SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo "执行结果$SUM"
-
-
输入
-
read (选项)(参数)
- 选项 -p 指定读取值时的提示符;
- 选项 -t 指定取值时等待的时间(秒),如果没有在指定的时间内输入,就不在等待
- 参数 变量名 指定读取值的变量名
- 应用
# 案例1 读取控制台输入一个NUM1值 read -p "请输入一个数NUM1=" NUM1 # 案例2 读取控制台输入的一个NUM2值,在10秒内输入 read -t 10 -p "请输入一个数NUM2,限制时间10秒" NUM2
-
-
函数
-
系统函数:预先定义好的函数,可以直接调用
- basename [pathname] [suffix] 取出路径中的文件名,如果命令放上扩展名,则把扩展名一并去掉
- dirname [文件绝对路径] 取出文件名中除去文件名的部分,只剩下目录部分
-
自定义函数
-
基本语法
[ function ] funname[()] { Action [return int;] } # 调用直接写函数名:funname [值] # 案例:计算输入两个参数的和(动态获取),getSum # 定义函数 function getSum(){ SUM=$[$n1+$n2] echo "两数和:$SUM" } # 输入两个数 read -p "输入n1=" n1 read -p "输入n2=" n2 #调用函数 getSum $n1 $n2
-
-
综合案例
需求
1.每天凌晨2:30备份 数据库Szl 到/data/backup/db
2.备份开始和备份结束能够给出提示信息
3.备份的文件要求以备份时间为文件名,并打包成.tar.gz文件
4.备份后检查是否有10天前的备份,如果有将其删除
实现
- 安装部署mysql,并建立数据库
- 备份数据脚本建立
- 设定任务调度
备份数据库脚本
#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=long+3977878
#备份的数据库名称
DATABASE=Szl
#创建备份目录,不存在则创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库,并指定输出文件进行压缩
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATATIME}/$DATATIME.sql.gz
#将文件处理成tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATATIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
#删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE}成功"
标签:文件,Shell,变量,备份,编程,echo,Linux,执行,输入
From: https://www.cnblogs.com/shaozelong/p/17151747.html