Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
脚本格式要求
脚本以#!/bin/bash开头,需要可执行权限
例:创建shell脚本,输出hello world
常用执行方式
方式1:输入脚本的绝对路径或相对路径(./xxx.sh) 说明:首先要赋予hello.sh脚本的 +x权限,再执行脚本
方式2:sh+脚本
说明:不用赋予脚本 +x权限,直接执行即可。
介绍 1)Linux Shell中的变量分为系统变量和自定义变量。 2)系统变量: $HOME等 3)显示当前shell中所有变量: set shell变量的定义 基本语法
变量定义实操
#!/bin/bash
#定义变量A
A=100
#输出变量需加上$
echo A=$A
echo "A=$A"
#撤销变量,变量A便没了
unset A
echo A=$A
#声明静态的变量B=2
readonly B=2
echo "B=$B"
C=`date`
D=$(date)
echo C=$C
echo D=$D
12345678910111213141516
定义变量的规则 1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头。 2.等号两边不能有空格 3.变量名称一般习惯为大写,这是一个规范,虽然小写也可运行。
将命令的返回值赋给变量
A=`date`反引号,运行里面的命令,并把结果返回给变量A,如果没有反引号表示的是将单词date给A
A=$(date)等价于上面的语句
12
基本语法
export 变量名=变量值 (功能描述:将shell变量输出为环境变量) source 配置文件 (功能描述:让修改后的配置信息立即生效) echo $变量名 (功能描述:查询环境变量的值) 案例 在/etc/profile文件中定义TOMCAT_ HOME环境变量,profile文件修改后,需刷新生效
vim /etc/profile
输入如下内容
#定义一个tomcat环境变量
export TOMCAT_HOME=/opt/tomcat
保存退出
刷新profile
source /etc/profile
1234567
查看环境变量TOMCAT HOME的值
echo $TOMCAT_HOME
1
shell多行注释
:<<!
注释内容
!
123
当我们执行一个shell脚本时 ,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
基本语法
$n ( 功能描述: n为数字, $0代表命令本身,$1-$9代表第一到第九个参数, 10以上的参数需要用大括号包含,如${10}
$* (功能描述:命令行中所有的参数,$*把所有参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待,分别输出)
$# (功能描述:命令行中所有参数的个数)
1234
案例:编写一个shell脚本position.sh,在脚本中获取到命令行的各个参数信息。
vim myshell.sh
输入如下内容
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数的个数=$#"
sh myshell.sh 10 20
12345678
含义:事先定义好的变量,直接在脚本中使用
基本语法
$$(功能描述:当前进程的进程号(PID)
$! (功能描述:后台运行的最后一个进程的进程号( PID) )
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一 个命令正确执行;
如果这个变量的值为非0 (具体是哪个数,由命令自己来决定), 则证明上一个命令执行不正确了。)
1234
应用实例 在一个shell脚本中简单使用一下预定义变量
vim preVar.sh
输入内容
#!/bin/bash
echo "当前进程的进程id=$$"
#以后台方式运行脚本,并获取进程ID
/root/shcode/myshell.sh &
echo "最后一个进程的进程号id=$!"
echo "将执行结果返回=$?"
12345678
基本语法
$((表达式))或 $[表达式] 或expr m + n
注意expr(expression表达式简写)运算符间要有空格,m,n为数字。
希望某个结果赋值给变量,使用``反引号,单引号就相当于字符串拼接
expr m - n
expr \*(乘),/(除),%(取余)
12345
应用实例
#!/bin/bash
#案例1:计算(2+3)*4的值
#方式1
RES1=$(((2+3)*4))
echo "res1=$RES1"
#方式2,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
#方式3
TEMP=`expr 2 + 3`
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res3=$RES3"
#案例2:请求出命令行的两个参数的和
SUM=$[$1+$2]
echo "sum=$SUM"
12345678910111213141516
判断语句基本语法 [ condition ] (注意condition前后要有空格) #非空返回true ,可使用$?验证( 0为true , > 1为false )
应用实例 [ smile ] ,返回true [ ],返回false [ condition ] && echo OK II echo notok,条件满足,执行后面的语句
常用判断条件
1)=字符串比较 2)两个整数的比较 -It 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 3)按照文件权限进行判断 -r 有读的权限 -w 有写的权限 -x 有执行的权限 4)按照文件类型进行判断 -f 文件存在并且是一 个常规的文件 -e 文件存在 -d 文件存在且是一个目录
基本语法
#单分支
if [ 条件判断 ]
then
代码
fi
#多分支
if [ 条件判断 ]
then
代码
elif [ 条件判断 ]
then
代码
fi
1234567891011121314
注意事项:[ 条件判断 ],中括号和条件之间必须有空格
案例
#!/bin/bash
#如果输入的参数,大于等于60,则输出及格了,如果小于60,则输出不及格
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
123456789
基本语法
case $变量名 in
"值1")
如果变量的值等于值1 ,则执行程序1
;;两分号代表结束
"值2")
如果变量的值等于值2,则执行程序2
;;
其他分支
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
123456789101112
案例
#!/bin/bash
#当命令行参数是1时,输出"周一"是2时,就输出"周二”,其它情况输出"other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo “other”
;;
esac
12345678910111213
基本语法
语法1:
for 变量 in 值1 值2 ...
do
代码
done
语法2:
for (( 始值;循环控制条件;量变化 ))
do
代码
done
1234567891011
应用实例
案例1:打印命令行输入的参数
#!/bin/bash
#$*输出方式
for i in "$*"
do
echo "num is $i"
done
#$@方式
echo "==========="
for j in "$@"
do
echo "num is $j"
done
123456789101112
案例2:从1加到100的值输出显示
#!/bin/bash
SUM=0
for(( i=1; i<=100; i++ ))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
1234567
基本语法
while [ 条件判断式 ]
do
代码
done
1234
案例:从命令行输入一个数n,统计从1+……n的值是多少?
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "结果=$SUM"
123456789
基本语法 read [选项] [参数] 选项: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒), 如果没有在指定的时间内输入,就不再等待。 参数 变量:指定读取值的变量名 应用实例
#!/bin/bash
#案例1 :读取控制台输入一个num1值
read -p "请输入指定的num1=" NUM1
echo "输入的num1=$NUM1"
#案例2 :读取控制台输入一个num2值,在5秒内输入
read -t 5 -p "请输入num2=" NUM2
echo "输入的num2=$NUM2"
1234567
系统函数 basename基本语法
basename [pathname] [suffix](功能:返回完整路径最后/的部分,常用于获取文件名)
basename [string] [suffix] (功能:basename命令会删掉所有的前缀包括最后一个/,然后将字符串显示出来)
suffix为后缀,如果suffix被指定了, basename会将pathname或string中的suffix去掉。
123
dirname基本语法
dirname 文件绝对路径 (功能描述:绝对路径中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
自定义函数
基本语法
[function] funname (参数){
Action;
[return int;]
}
[]表示可有可无
调用直接写函数名: funname [值]
123456
应用实例
#!/bin/bash
#案例:计算输入两个参数的和,getSum
function getSum(){
sum=$[$n1+$n2]
echo "和是=$sum"
}
#输入两个值
read -p "第一个值=" n1
read -p "第二个值=" n2
#调用函数
getSum $n1 $n2
1234567891011
需求分析 1.每天凌晨2:30备份数据库smile到/data/backup/db 2.备份开始和备份结束能够给出相应的提示信息 3.备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如: 2021-07-15 230201.tar.gz 4.在备份的同时,检查是否有7天前备份的数据库文件,如果有就将其删除。
vim /usr/sbin/mysql_db_backup.sh 内容如下
#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#当前时间
DATATIME=$(date +%Y-%m-%d_%H%M%S)
#数据库地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=root6666
#备份的数据库名
DATABASE=smile
#创建备份目录,不存在就创建
[ ! -d "${BACKUP}/${DATATIME}" ] && mkdir -p "${BACKUP}/${DATATIME}"
#备份数据库
echo "开始备份数据库${DATABASE}"
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 $DATATIME.tar.gz ${DATATIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATATIME}
#删除7天前的备份
find ${BACKUP} -atime +7 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE}成功"
1234567891011121314151617181920212223242526
定时脚本
命令行敲crontab -e ,接着输入如下内容
30 2 * * * /usr/sbin/mysql_db_backup.sh
1
效果图