Shell编程:
1:Shell
Shell是一个命令行解释器,为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户使用Shell启动,挂起,停止,甚至编写一些程序。
脚本格式要求:
- 脚本以 #!/bin/bash 开头
- 脚本需要有可执行权限
脚本执行方式:
- 赋予脚本+x的执行权限,再执行脚本
[root@lkLinux01 testShell]# chmod u+x hello.sh #为所有者添加执行权限
[root@lkLinux01 testShell]# ./hello.sh #执行
hello,world
[root@lkLinux01 testShell]# /home/testShell/hello.sh #执行
hello,world
[root@lkLinux01 testShell]# cat hello.sh
#!/bin/bash
echo "hello,world"
2.sh+脚本,无需赋予x权限
[root@lkLinux01 testShell]# sh hello.sh #执行
hello,world
2:Shell变量
- Linux的Shell变量分为两种:系统变量和用户自定义变量
- 系统变量:$HOME $PWD $SHELL $USER $PATH等 比如 echo $HOME
- 显示当前所有系统变量:set
自定义变量:
- 定义变量 变量名=值
- 撤销变量 unset 变量名
- 声明静态变量 readonly变量=值 静态变量不能unset
1 #!/bin/bash
2 echo "hello,world"
3 #定义变量A
4 A=100
5 #输出变量需要加$
6 echo "A=$A"
7 echo A=$A
8 #撤销变量A
9 unset A
10 echo A=$A
11 #声明静态变量 不能unset
12 readonly B=20
13 echo B=$B
定义变量规则:
- 变量名称由字母,数字,下划线组成,不可以以数字开头
- 等号两侧不能存在空格
- 变量名称一般习惯为大写
将命令的返回值赋给变量:
A=`date` #将date函数的返回值赋给A
A=$(date) #将date函数的返回值赋给A
3:Shell设置环境变量
- export 变量名=变量值 (将Shell变量输出为环境变量/全局变量被全局文件共享)
- source配置文件(让修改后的配置信息生效)
- echo $变量名(查询环境变量的值)
Shell多行注释 :<<! !
4:位置参数变量
- 执行Shell脚本时,如果希望获取到命令行参数信息,就可以使用到位置参数变量。
- $n(n为数字,$0表示命令本身 1 − 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 1-9代表第一到第九个参数,十以上的参数需要用大括号包含 1−9代表第一到第九个参数,十以上的参数需要用大括号包含{10})
- $*(变量代表命令行中所有的参数,将所有的参数看作一个整体)
- @ ( 变 量 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @(变量代表命令行中所有的参数,不过 @(变量代表命令行中所有的参数,不过@将每一个参数区别对待)
- $#(变量代表命令行中所有参数个数)
echo "命令本身为$0"
echo "参数1=$1 ,参数2=$2"
echo "所有参数为$*"
echo "所有参数为$@"
echo "参数个数为$#"
5:预定义变量
- shell设计者已经定义好的变量,可以直接在shell脚本使用。
- $$(当前进程PID)
- $!(后台运行的最后一个进程PID)
- $?(最后一次执行的命令的返回状态,如果变量值为0证明上一个命令正确执行,如果非0则上一个命令不正确)
echo "当前进程PID为 $$"
#一后台的方式运行一个脚本并获取进程号
/home/testShell/hello.sh & #&以后台方式运行脚本
echo "最后一个后台方式运行的进程PID为 $!"
echo "最后一次执行命令的返回状态 $?"
6:运算符
- “ ( ( 运 算 符 ) ) ” “ ((运算符))” “ ((运算符))”“[运算符]” expr m + n expr中间需要空格
- expr m - n expr \ *为乘法 % /
- 如果想将计算结果为某个变量赋值 需要 ``反引号括起来
#计算(2+3)*4
#写法1
RES1=$(((2+3)*4))
echo $RES1
#写法2
RES2=$[(2+3)*4]
echo $RES2
#写法3
TEMP=`expr 2 + 3`
echo $TEMP
RES3=`expr $TEMP \* 4`
echo $RES3
#计算参数1和参数2
RES4=$[$1 % $2]
echo $RES4
7:条件判断
- [ condition ] (condition前后需要空格)
- 非空返回true 使用 $!验证 0为true >1为false
- [ condition ] && echo OK || echo notok 如果条件满足则执行后面的语句
命令 | 功能 |
---|---|
= | 判断字符串是否相等 |
-lt | 整数小于 |
-le | 整数小于等于 |
-eq | 整数等于 |
-gt | 整数大于 |
-ge | 整数大于等于 |
-ne | 整数不等于 |
-r | 文件有读取权限 |
-w | 文件有写权限 |
-x | 文件有执行权限 |
-f | 文件存在且为常规文件 |
-e | 文件存在 |
-d | 文件存在且为目录 |
#!/bin/bash
#判断ok等于ok
if [ "ok"="ok" ]
then
echo "equals"
fi
#23是否大于22
if [ 23 -ge 22 ]
then
echo "大于"
fi
#判断文件是否存在
if [ -e /home/testShell/hello.sh ]
then
echo "存在"
fi
#判断文件是否没有执行能力
if [ ! -x /home/testShell/hello.sh ]
then
echo "不存在执行能力"
fi
8:流程控制
if语句:
if [ 条件判断式 ]
then
代码
fi
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case语句:
case $变量 in
“值1”)
;;
“值2”)
;;
*)
不为上面的所有则执行此语句;;
esac
#!/bin/bash
case $1 in
"1")
echo "周一" ;;
"2")
echo "周二" ;;
"3")
echo "周三" ;;
"4")
echo "周四" ;;
"5")
echo "周五" ;;
"6")
echo "周六" ;;
"7")
echo "周天" ;;
*)
echo "星期八" ;;
esac
for循环:
for 变量 in 值1 值2 值3
do
程序
done
#!/bin/bash
echo "星的输出"
for i in "$*"
do echo "num is $i"
done
echo "==========="
echo "猴头的输出"
for i in "$@"
do echo "num is $i "
done
[root@lkLinux01 testShell]# sh forTest.sh 4 2 1
星的输出
num is 4 2 1
===========
猴头的输出
num is 4
num is 2
num is 1
for((初始值;循环控制条件;变量变化))
do
程序
done
SUM=0
for(( i=1; i<=$1; i++))
do
SUM=$[ $SUM + $i ]
done
echo "$SUM"
while循环:
while [ 条件判断式 ]
do
程序
done
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[ $SUM + $i ]
i=$[ $i + 1 ]
done
echo "sum=$SUM"
9:read读取控制台输入
read[选项](参数)
命令 | 功能 |
---|---|
-p | 指定读取值时的提示符 |
-t | 指定读取值时等待的时间,如果未在等待时间内输入,则不等待 |
变量 | 只当读取值的变量名 |
#!/bin/bash
#读入输入的NUM1
read -p "请输入NUM1=" NUM1
echo "NUM1=$NUM1"
#10s内读入NUM2
read -t 10 -p "input NUM2=" NUM2
echo "NUM2=$NUM2"
10:函数
Shell分为系统函数和自定义函数。
系统函数 | 命令 | 功能 |
---|---|---|
basename | 返回完整路径最后/的部分,常用于获取文件名 | |
basename [pathname]{suffix} | ||
basename[string]{suffix} | 删除所有前缀包括最后一个/字符 将字符串显示 | |
suffix | 后缀,如果指定后缀则会删除string或者pathname的suffix部分 | |
dirname | 返回完整路径最后/的前面部分,用于获取路径 | |
自定义函数 | 命令 | 功能 |
基本语法:
[function] funname[( )]
{
Action;
[return int]
}
调用: funname [值]
function getSum(){
SUM=$[n1 + n2 ]
echo "和为$SUM"
}
read -p "请输入一个数字n1=" n1
read -p "请输入一个数字n2=" n2
#调用自定义函数
getSum $n1 $n2
[root@lkLinux01 testShell]# basename /home/testShell/testCase.sh #获取文件名字
testCase.sh
[root@lkLinux01 testShell]# basename /home/testShell/testCase.sh .sh #获取文件名且删除.sh后缀
testCase
[root@lkLinux01 testShell]# dirname /home/testShell/testCase.sh #返回路径部分
/home/testShell
10:Shell编程综合
1:每天2:30备份数据库 到 /data/backup/mysqldb
2:备份开始和备份结束给出相应的提示信息
3:备份后的文件要求按照时间为文件名,打为.tar.gz 2022-03-28_XXXX.tar.gz
4:备份同时检测是否有十天前的数据有则删除
crond定时调用脚本,脚本负责操作。
[root@lkLinux01 mysqlDB]# crontab -l
30 2 * * * /usr/sbin/mysql_db_backup.sh
将脚本编写到usr/sbin目录下。
#!/bin/bash
#备份的目录
BACKUP=/data/backup/mysqlDB
#获取当前时间
DATE=$(date +%Y-%m-%d_%H%M%S)
#数据库相关信息
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PWD=root123456
#备份的数据库名
DATABASE=lkTest
#创建备份目录
[ ! -d "${BACKUP}/$DATE" ] && mkdir -p "${BACKUP}/${DATE}"
#备份数据库
mysqldump -u${DB_USER} -p${DB_PWD} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATE}/$DATE.sql.gz
#将文件打包文tar.gz
cd ${BACKUP}
#将整个文件夹打包
tar -zcvf $DATE.tar.gz ${DATE}
#删除对应备份目录
rm -rf ${BACKUP}/${DATE}
#删除10天前的备份文件
#按照10天前查找 按照名字查找
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份mysql成功"