知识点和问题
1.Shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
2.Shell编程快速入门
1)脚本以#!/bin/bash开头
2)脚本需要有可执行权限
常见一个Shell脚本,输出hello world!
[root@localhost shell]# cat myShell2.sh
#!/bin/bash
echo "hello,wrold!"
chmod 744
执行方式1:
[root@localhost shell]# chmod o+x myShell2.sh
[root@localhost shell]# ./myShell2.sh
hello,wrold!
方式2:不用赋予脚本权限,直接执行命令:
[root@localhost shell]# chmod o-x myShell2.sh
[root@localhost shell]# sh myShell2.sh
hello,wrold!
3.Shell的变量
系统变量:$HOME
、$PWD
、$SHELL
、$USER
等等
显示Shell中所有变量
set
样例2:
shell脚本如下:
#!/bin/bash
#echo "hello,wrold!"
echo "PATH=$PATH"
echo "user=$USER"
测试:
[root@localhost shell]# sh myShell2.sh
PATH=/opt/jdk1.7.0_79/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
user=root
4.Shell变量的定义
基本语法:
1)定义变量:变量=值
2)撤销变量:unset 变量
3)声明静态变量:readonly变量,注意,不能unset
案例1:定义变量A和输出变量A
shell脚本如下:
#!/bin/bash
A=100
echo "A=$A"
运行结果如下:
[root@localhost shell]# sh myShell2.sh
A=100
案例2:销毁变量A
#!/bin/bash
A=100
echo "A=$A"
unset A
echo "A=$A"
运行结果:
[root@localhost shell]# sh myShell2.sh
A=100
A=
案例3:声明静态的变量B=2,不能unset
#!/bin/bash
readonly A=99
echo "A=$A"
unset A
echo "A=$A"
测试运行:
[root@localhost shell]# sh myShell2.sh
A=99
myShell2.sh: line 4: unset: A: cannot unset: readonly variable
A=99
5.定义变量的规则
1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2)等号两侧不能有空格
3)变量名称一般习惯为大写
6.将命令的返回值赋给变量
1)A=ls-la
反引号,运行里面的命令,并把结果返回给变量A
2)A=$(ls-la)
等价于反引号
#!/bin/bash
RESULT='ls -l /home'
echo $RESULT
echo ""
MY_DATE=$(date)
echo $MY_DATE
测试结果如下:
[root@localhost shell]# sh myShell2.sh
ls -l /home
2020年 07月 31日 星期五 09:03:51 CST
7.设置环境变量
基本语法
export变量名=变量值(功能描述:将shell变量输出为环境变量)
source配置文件(功能描述:让修改后的配置信息立即生效)
echo $变量名(功能描述:查询环境变量的值)
快速入门
1)在/etc/profile文件中定义TOMCAT_HOME环境变量
#定义一个环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
2)查看环境变量TOMCAT_HOME的值
[root@localhost shell]# source /etc/profile
[root@localhost shell]# echo $TOMCAT_HOME
/opt/tomcat
3)在另外一个shell程序中使用TOMCAT_HOME
#!/bin/bash
echo "tomcathome=$TOMCAT_HOME"
输出shell
[root@localhost shell]# sh myShell2.sh
tomcathome=/opt/tomcat
注意:在输出TOMCAT_HOME环境变量前,需要让其生效source /etc/profile
多行注释:
:<<!
RESULT='ls -l /home'
echo $RESULT
echo ""
MY_DATE=$(date)
echo $MY_DATE
!
8.位置参数变量
介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如:./myshell.sh100 200 ,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息
基本语法
$n
(功能描述:n为数字,$0
代表命令本身,$1-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
)
$*
(功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体)
$@
(功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待)$#
(功能描述:这个变量代表命令行中所有参数的个数)
位置参数变量
应用实例
案例:编写一个shell脚本positionPara.sh,在脚本中获取到命令行的各个参数信息。
输入shell脚本如下:
#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"
运行结果如下:
[root@localhost shell]# sh positionPara.sh 30 60
positionPara.sh 30 60
30 60
30 60
2
9.预定义变量
基本介绍
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$
(功能描述:当前进程的进程号(PID))
$!
(功能描述:后台运行的最后一个进程的进程号(PID))
$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)应用实例在一个shell脚本中简单使用一下预定义变量
应用实例
在一个shell脚本中简单使用一下预定义变量
#!/bin/bash
echo "当前进程号=$$"
./myShell2.sh &
echo "后台最后一个进程号=$!"
echo "执行的值=$?"
运行结果:
[root@localhost shell]# sh perVar.sh
当前进程号=9370
后台最后一个进程号=9371
执行的值=0
[root@localhost shell]# tomcathome=/opt/tomcat
10.运算符
基本语法
1)“$((运算式))
”或“$[运算式]
”
2)expr m + n
注意expr运算符间要有空格
3)expr m-n
4)expr *, /, %乘,除,取余
应用实例
案例1:计算(2+3)X4的值
1)$((运算符))
#!/bin/bash
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
执行结果如下:
[root@localhost shell]# sh demo.sh
result1=20
2)$[运算符]
脚本如下
#!/bin/bash
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"
运行结果如下:
[root@localhost shell]# sh demo.sh
result2=20
3)expr
shell脚本如下:
#!/bin/bash
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"
运行结果如下:
[root@localhost shell]# sh demo.sh
result3=20
案例2:请求出命令行的两个参数[整数]的和
shell脚本如下:
#!/bin/bash
RESULT4=$[$1+$2]
echo "result4=$RESULT4"
运行测试:
[root@localhost shell]# sh demo.sh 1 2
result4=3
11.条件判断
基本语法
[ condition ](注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
应用实例
[ atguigu ] 返回true
[] 返回false
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句
12.判断语句
•常用判断条件
1)两个整数的比较
=字符串比较
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
按照文件权限进行判断
-r有读的权限
-w有写的权限
-x有执行的权限
3)按照文件类型进行判断
-f文件存在并且是一个常规的文件
-e文件存在
-d文件存在并是一个目录
应用实例
案例1:"ok"是否等于"ok"判断语句
脚本如下:
#!/bin/bash
if [ "ok" = "ok" ]
then echo "equals"
fi
运行结果如下:
[root@localhost shell]# sh judge.sh
equals
案例2:23是否大于等于22判断语句
脚本如下
#!/bin/bash
if [ 22 -gt 22 ]
then
echo "大于"
fi
if [ 22 -eq 22 ]
then
echo "等于"
fi
运行结果如下:
[root@localhost shell]# sh judge.sh
等于
案例3:/home/shell/aaa.txt目录中的文件是否存在判断语句
#!/bin/bash
if [ -e /home/shell/aaa.txt ]
then
echo "存在"
fi
运行测试结果如下:
[root@localhost shell]# touch aaa.txt
[root@localhost shell]# sh judge.sh
存在
13.流程控制
基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then 程序
elif [ 条件判断式 ]
then
程序
fi
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出"及格了",如果小于60,则输出"不及格"
脚本代码如下:
#!/bin/bash
if [ $1 -ge 60 ]
then echo "大于60"
elif [ $1 -lt 60 ]
then echo "小于60"
fi
运行结果如下:
[root@localhost shell]# sh testIf.sh 1
小于60
14.case语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例1:当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出"other"
脚本如下:
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
esac
运行结果如下:
[root@localhost shell]# sh caseTest.sh
other
[root@localhost shell]# sh caseTest.sh 1
周一
[root@localhost shell]# sh caseTest.sh 2
周二
[root@localhost shell]# sh caseTest.sh 3
other
15.for循环的第一种方式
for变量in值1值2值3…
do
程序
done
案例1:打印命令行输入的参数
脚本如下:
#!/bin/bash
for i in "$*"
do
echo "the num is $i"
done
运行测试如下:
[root@localhost shell]# sh testFor.sh 1 2 3
the num is 1 2 3
方式2
#!/bin/bash
for i in "$@"
do
echo "$i"
done
运行结果如下:
[root@localhost shell]# sh testFor2.sh 2 3
2
3
16.for循环的第二种方式
for((初始值;循环控制条件;变量变化))
do
程序
done
案例1:从1加到100的值输出显示[这里可以看出
∗
和
*和
∗和@的区别]
#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
[root@localhost shell]# sh testFor3.sh
sum=5050
17.while循环基本语法1
while[条件判断式]
do
程序
done
案例1:从命令行输入一个数n,统计从1+…+ n的值是多少?
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum=$SUM"
[root@localhost shell]# sh testWhile.sh 2
sum=3
18.read读取控制台输入
基本语法
read(选项)(参数)选项:
-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。参数
变量:指定读取值的变量名
案例1:读取控制台输入一个num值
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"
[root@localhost shell]# sh testRead.sh
请输入一个数num1=23
你输入的值是num1=23
案例2:读取控制台输入一个num值,在10秒内输入。
#!/bin/bash
read -t 10 -p "请输入一个数num2=" NUM2
echo "你输入的值是num1=$NUM2"
[root@localhost shell]# sh testRead2.sh
请输入一个数num2=23
你输入的值是num1=23
19.系统函数
basename基本语法
功能:返回完整路径最后/的部分,常用于获取文件名
basename[pathname] [suffix]
basename [string] [suffix]
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
•应用实例
案例1:请返回/home/aaa/test.txt的"test.txt"部分
[root@localhost ~]# basename /home/aaa/test.txt
test.txt
[root@localhost ~]# basename /home/aaa/test.txt .txt
test
[root@localhost ~]# basename /home/aaa/
aaa
dirname基本语法
功能:返回完整路径最后/的前面的部分,常用于返回路径部分
案例1:请返回/home/aaa/test.txt的/home/aaa
[root@localhost ~]# dirname /home/aaa/test.txt
/home/aaa
20.自定义函数
•基本语法[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
案例1:计算输入两个参数的和,getSum
shell脚本如下:
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
read -p "请输入第一个数n1:" n1
read -p "请输入第二个数n2:" n2
getSum $n1 $n2
[root@localhost ~]# sh functionTest.sh
请输入第一个数n1:12
请输入第二个数n2:12
和是=24
21.需求分析
1)每天凌晨2:10备份数据库atguiguDB到/data/backup/db
2)备份开始和备份结束能够给出相应的提示信息
3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:
2018-03-12_230201.tar.gz
4)备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
脚本代码如下:
#!/bin/bash
BACKUP=/home/learn/shell
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo $DATETIME
echo "=================开始备份================"
echo "=================备份的路径是$BACKUP/$DATETIME.tar.gz"
HOST=localhost
DATABASE=test
DB_USER=mysql
DB_PWD=1234567890
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
/usr/local/mysql/bin/mysqldump -u$DB_USER -p$DB_PWD --host=$HOST $DATABASE | gzip >$BACKUP/$DATETIME/$DATETIME.sql.gz
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
rm -rf $BACKUP/$DATETIME
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=======备份文件成功======"
配置定时
[root@localhost shell]# crontab -e
10 2 * * * /home/learn/shell/mysql_db_backup.sh