hello world!
#! bin/bash
echo "hello world!"
执行
./my.sh #./my.sh 执行当前目录的my.sh(需要有可执行的权限)
/home/li/my.sh #绝对路径
sh ./my.sh #没有执行权限也可以执行
变量
- 系统变量
echo "PATH = $PATH"
echo "user=$USER
set #查看所有的系统变量
#常见系统变量:$HOME,$PWD,$SHELL,$USER
- 自定义变量(变量名最好大写)
A=100 #定义一个变量,注意a = 100不行,必须紧挨着。
echo $A #使用变量
unset A #销毁变量
readonly a = 800 #静态变量,不可以unset
注意:变量定义两侧不能有空格
- 赋值
B=`ls -l /home` #将命令返回值赋值给B,必须用``包起来
echo $B
B=$(ls -l /home) #第二种赋值写法
echo $B
- 设置环境变量(供其它shell使用)
export VAR=/opt/tomcat #将shell变量输出为环境变量/全局变量,这是在/etc/profile里进行配置
source /etc/profile #是配置生效
#然后环境变量可以在shell编程中使用
echo $VAR #就能拿到值/opt/tomcat
shell脚本的 注释符号(多行)::<<! 注释内容!
- 位置参数变量
./my.sh 100 200 #在运行脚本时附加参数
#获取100,及200
$n #$0表示命令本身 $1-$9表示一到九的参数,十以上的参数使用${10}
$* #代表命令行中的所有参数,把所有的参数看作整体
$@ #代表所有参数,但是每个参数区别对待
$# #代表阐述个数
- 预定义变量
$$ #当前进程号
$! #后台运行的最后一个进程号
$? #最后一次执行命令返回的状态,0表示正确执行
运算符
$((运算式))
$[运算式]
VAR=$[2*2] #将表达式2*2的值赋值给VAR
echo "VAR=$VAR"
VAR1=$((2+3)) #将表达式2 + 3的值赋值给VAR1
echo "VAR1=$VAR1"
expr `m + n` #注意需要空格,expr为表达式的意思,如果需要将expr的值赋值给一个变量需要用``赋值
expr `m - n`
expr `m % n`
expr `m \* n` #注意*是\* 需要转义
VAR=`expr 2 + 3`
VAR1=`expr 2 - 3`
VAE2=`expr 2 \* 3`
条件判断
特别注意:1. [ ] 空判断也是需要空格的 2.[ ] 内非空即为真
[ condition ] #注意两边有空格,非空为真
if [ con ]
then
echo ""
fi #结束符号
if []
then
echo
elif []
then
echo
fi #结束符号
常用判断条件:
- =宇符串比较
2)两个整数的比较
- -It小于
- -le小于等于little equal
- -eq等于
- -gt大于
- -ge大于等于
- -ne不等于
3)按照文件权限进行判断 - r 有读的权限
- W有写的权限
- X有执行的权限
4)按照文件类型进行判断 - f文件存在并且是一个常规的文件
- e文件存在
- d文件存在并是一个目录
#example
if [ "ok" = "ok" ]
then
echo "yes"
fi
if [ 23 -ge 25 ]
then
echo "yes"
fi
if [ -d /home/liyong ]
then
echo "yes d is exists!"
fi
case分支
case $变量名 in
"value")
echo ""
;; #结束
"value")
echo ""
;;
*) #都没有匹配上
echo ""
;;
esac #结束
#example
case $1 in #取携带的第一个参数,这个可以用于启动脚本编写可以带参数start,stop,restart
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac #case反着写,表示结束
循环for
for 变量 in 值1 值2 值3
do
逻辑
done
#example1
for i in "$*" #将所有参数作为一个整体,就是当作整个字符串只输出一次
do
echo "num is $i"
done
#example2
for i in "$@" #将参数区别对待,如带三个参数就有三个输出
do
echo "$i"
done
第二种语法格式案例
#求1-100的和
SUM=0
for ((i=1;i<=100;i++)) #两层大括号,100可以变为参数如$1,就可以根据输入值控制循环
do SUM=$[$SUM+$i]
done
echo "SUM = $SUM"
循环while
while [ ] #注意条件判断两边也有空格
do
done
#example
#求1-100的和
i=0;
SUM=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"
read 控制台输入
read
-p 指定读取值时的提示符
-t 指定读取时的等待时间
read -p "请输入" NUM #将输入的值给NUM
#example
read -p "请输入一个数NUM” NUM
read -t 10 -p "请输入一个数NUM” NUM #10秒之后自动退出
函数
系统函数
- basename
basename /home/li/li.txt #输出li.txt
basename /home/li/li.txt .txt #输出li
- dirname
dirname /home/li/li.txt #输出/home/li
自定义函数
example计算两个数的和
function getSum() {
sum=$[$n1+$n2]
echo sum
}
read -p n1
read -p n2
getSum $n1 $n2
综合案例
关于
(
)
,
(),
(),[]等一些符号的详细文档:
https://blog.csdn.net/x1269778817/article/details/46535729
需求分析
1.每天凌晨 2:30备份数据库hspedu到/data/backup/db
2.备份开始和备份结束能够给出相应的提示信息
备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2021-03-12 230201.tar.gz
4.在备份的同时 ,检查是否有10天前备份的数据库文件,如果有就将其删除。
#!/bin/bash
#备份目录
BACKUP=/opt/mysql/db
#当前时间
DATETIME=%(date +%Y-%m-%d_%H%M%S)
echo DATETIME
HOST=loclhost
USER=root
PW=123456
DATABASE=student
#如果不存在目录则创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库
mysqldump -u${USER} -p${PW} -q -R --databases ${DATABASE} | gzip > #{BACKUP}/${DATETIME}/$DATETIME.sql.gz
#将文件处理为tar.gz
cd ${BACKUP}
tar -zxvf $DATETIME.tar.gz ${DATETIME}
#删除备份目录
rm -rf ${BACKUP}/${DATETIME}
#删除10天前备份的数据库
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份成功"
#这条语句是写在外面
crontab -e 30 2 * * * /usr/sbin/back.sh #凌晨两点执行
鸣谢
感谢韩顺平老师,这些笔记都是看老师视频课记下来的。