第17章 大数据定制篇 - Shell编程

【小白入门 通俗易懂】2021韩顺平 一周学会Linux_哔哩哔哩_bilibili

目录

17.1 为什么要学习Shell编程

17.2 Shell是什么

17.3 Shell脚本的执行方式

17.3.1 脚本格式要求

17.3.2 编写第一个Shell脚本

17.3.3脚本的常用执行方式

17.4 Shell 的变量

17.4.1 Shell变量介绍

17.4.2 shell变量的定义

17.4.3 shell变量的定义

17.5 设置环境变量

17.5.1 基本语法

17.5.2 快速入门

17.6 位置参数变量

17.6.1 介绍

17.6.2 基本语法

17.6.3 位置参数变量

17.7 预定义变量

17.7.1 基本介绍

17.7.2 基本语法

17.7.3 应用实例

17.8 运算符

17.8.1 基本介绍

17.8.2 基本语法

17.8.3 应用实例oper.sh

17.9条件判断

17.9.1 判断语句

17.10 流程控制

17.10.1 if判断

17.10.2 case语句

17.10.3 for循环

17.10.4 while循环

17.11 read 读取控制台输入

17.11.1基本语法

17.11.2 应用实例testRead.sh

17.12函数

17.12.1函数介绍

17.12.2系统函数

17.12.3 自定义函数

17.13 Shell 编程综合案例

17.13.1 需求分析

17.13.2代码  /usr/sbin/mysql_db.backup.sh

17.1 为什么要学习Shell编程

(1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
(2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行           程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
(3)对于大数据程序员来说,需要编写Shell程序来管理集群

17.2 Shell是什么

       Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。看一个示意图

17.3 Shell脚本的执行方式

17.3.1 脚本格式要求

(1)脚本以 #!/bin/bash  开头(shell类型)
(2)脚本需要有可执行权限

17.3.2 编写第一个Shell脚本

》需求说明:创建一个Shell脚本,输出 hello world!
vim hello.sh

#!/bin/bash
echo "hello, world~"

17.3.3 脚本的常用执行方式

》方式1 (输入脚本的绝对路径或相对路径)
         说明 : 首先要赋予 helloworld.sh 脚本的+x权限------》chmod  u+x  hello.sh
         再执行脚本比如  ./hello.sh  或者使用绝对路径  /root/shcode/hello.sh
》方式2 (sh+脚本)
         说明:不用赋予脚本+x权限,直接执行即可
         比如  sh hello.sh,也可以使用绝对路径

17.4 Shell 的变量

17.4.1 Shell变量介绍

(1)Linux Shell 中的变量分为,系统变量用户自定义变量
(2)系统变量:  $HOME、$PWD、$SHELL、$USER等等,比如  :  echo $HOME  等等..
(3)显示当前shell 中所有变量   :  set

17.4.2 shell变量的定义

》基本语法
(1)定义变量:        变量名=值      (中间不要空格)
(2)撤销变量:        unset  变量
(3)声明静态变量: readonly变量,注意 : 不能 unset
》快速入门
(1)案例1:定义变量A
(2)案例2:撤销变量A
(3)案例3:声明静态的变量B=2,不能 unset

#!/bin/bash

#案例1:定义变量A
A=100

#输出变量需要加上$
echo $A
echo A=$A
echo "A=$A"

#案例2:撤销变量A
unset A
echo "A=$A"

#案例3:声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"
#unset B  会错误

#将指令返回的结果赋给变量
:<<!
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
!

#使用环境变量TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"

(4)案例4:可把变量提升为全局环境变量,可供其他 shell程序使用[该案例后面讲]

17.4.3 shell变量的定义

》定义变量的规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
(2)等号两侧不能有空格
(3)变量名称一般习惯为大写,这是一个规范,我们遵守即可

》将命令的返回值赋给变量
(1)A=`date`   反引号,运行里面的命令,并把结果返回给变量A
(2)A=$(date)  等价于反引号

17.5 设置环境变量

17.5.1 基本语法

(1)export变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量
(2)source 配置文件       (功能描述:让修改后的配置信息立即生效)
(3)echo $变量名              (功能描述:查询环境变量的值)
(4)示意(便于多个脚本使用)

17.5.2 快速入门

(1)在/etc/profile文件中定义TOMCAT_HOME环境变量    (vim etc/profile)
(2)查看环境变量TOMCAT_HOME的值   (echo $TOMCAT_HOME)---> /opt/tomcat
(3)在另外一个shell程序中使用TOMCAT_HOME
注意 : 在输出TOMCAT_HOME环境变量前,需要让其生效 source /etc/profile

 shell脚本的多行注释:  <<!  内容  !

17.6 位置参数变量

17.6.1 介绍

     当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如 : ./myshell.sh 100 200,这个就是一个执行shell 的命令行,可以在myshell脚本中获取到参数信息

17.6.2 基本语法

$n   (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})------》类似于传参
$*   (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#   (功能描述:这个变量代表命令行中所有参数的个数)

17.6.3 位置参数变量

案例:编写一个shell脚本 position.sh ,在脚本中获取到命令行的各个参数信息。

输入:  chmod u+x myshell.sh   ---->   ./myshell.sh  100  200
输出:  

17.7 预定义变量

17.7.1 基本介绍

就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

17.7.2 基本语法

(1)$$  (功能描述:当前进程的进程号 (PID) )
(2)$!   (功能描述:后台运行的最后一个进程的进程号(PID))
(3)$?  (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

17.7.3 应用实例

在一个shell脚本中简单使用一下预定义变量   preVar.sh

#!/bin/bash
echo "当前执行的进程id=$$"
#以后台的方式运行一个脚本,并获取他的进程号
/root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?""

输出:(脚本中运行了另一个脚本)

17.8 运算符

17.8.1 基本介绍

学习如何在shell中进行各种运算操作

17.8.2 基本语法

(1)“ $((运算式)) ”或“  $[运算式] ”或者 expr m + n    //    expression 表达式
(2)注意 expr 运算符间要有空格,如果希望将 expr的结果赋给某个变量,使用  ` `
(3)expr m - n
(4)expr  \*,/,%      乘,除,取余

17.8.3 应用实例oper.sh

案例1 : 计算(2+3)X 4 的值
案例2 : 请求出命令行的两个参数[整数]的和 20 50

#!/bin/bash
#案例l:计算(2+3)X4的值

#使用第一种方式
RES1=$(((2+3)*4))
echo "res1=$RES1"

#使用第二种方式,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"

#使用第三种方式expr,注意+两边空格
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"

#案例2:请求出命令行的两个参数[整数]的和20 50
SUM=$[$1+$2]
echo "sum=$SUM"
# 控制台输入  ./oper.sh 20 50

17.9条件判断

17.9.1 判断语句

》基本语法
[ condition ]    (注意condition前后要有空格)
# 非空返回true,可使用  $?  验证(0为true,>1为false>

》应用实例
[ hspEdu ]    返回true
[ ]                 返回false,也要有空格
[ condition ] && echo OK || echo notok      条件满足,执行后面的语句

》判断语句
常用判断条件
(1)= 字符串比较
(2)两个整数的比较
         -lt   小于
         -le  小于等于 little equal
         -eq 等于
         -gt  大于
         -ge 大于等于
         -ne 不等于
(3)按照文件权限进行判断
         -r   有读的权限
         -w  有写的权限
         -x   有执行的权限
(4)按照文件类型进行判断
          -f   文件存在并且是一个常规的文件
          -e  文件存在
          -d  文件存在并是一个目录

》应用实例
案例1 :  "ok"是否等于"ok"
判断语句 : 使用  =
案例2 : 23是否大于等于22
判断语句 : 使用  -ge
案例3 : /root/shcode/aaa.txt 目录中的文件是否存在
判断语句 : 使用  -f
代码如下 :

17.10 流程控制

17.10.1 if判断

》基本语法
if [ 条件判断式 ]
then
代码
fi
或者,多分支
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi
》注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格

》应用实例   ifCase.sh
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出“及格了",如果小于60.则输出"不及格"

17.10.2 case语句

》基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

》应用实例 testCase.sh
案例1:当命令行参数是 1 时,输出"周一",是 2 时,就输出"周二",其它情况输出   "other"

17.10.3 for循环

》基本语法1
for  变量  in  值1  值2  值3...
do
程序/代码
done

》应用实例 testFor1.sh
案例1 : 打印命令行输入的参数  [这里可以看出  $* $@ 的区别]

》基本语法2 (范围型)
for (( 初始值;循环控制条件;变量变化 ))
do
程序/代码
done

》应用实例 testFor2.sh
案例1:从1加到100的值输出显示

案例1:
输入:chmod u+x testFor1.sh ---------> ./testFor1.sh  100  200  300
输出:  num is  100  200  300
==========================
             num is 100
             num is 200
             num is 300
案例2:
如果把100做成一个变量,只需要把100换成 $1, 运行命令时输入即可
比如: ./testFor2.sh  200

17.10.4 while循环

》基本语法1
while[ 条件判断式 ]
do
程序 /代码
done
注意: while和 [ 有空格,条件判断式和 [ 也有空格

》应用实例 testWhile.sh
案例1:从命令行输入一个数n,统计从1+..+ n的值是多少?

#!/bin/bash
#案例1:从命令行输入一个数n,统计从1+ ..+ n的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
     SUM=$[$SUM+$i]
     #i自增
     i=$[$i+1]
done
echo "执行结果=$SUM"

17.11 read 读取控制台输入

17.11.1基本语法

read(选项)(参数)
》选项:
-p  :   指定读取值时的提示符;
-t   :   指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
》参数
   变量:指定读取值的变量名

17.11.2 应用实例testRead.sh

案例1:读取控制台输入一个 NUM1值
案例2:读取控制台输入一个NUM2值,在10秒内输入。
代码:

#!/bin/bash
#案例1:读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"

#案例2:读取控制台输入一个NUM2值,在10秒内输入。
read -t 10 -p"请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

17.12 函数

17.12.1 函数介绍

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

17.12.2 系统函数

》basename 基本语法
功能  返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]   (功能描述: basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项  :
suffix为后缀,如果suffix被指定了,basename 会将pathname或string中的 suffix去掉。

》应用实例
案例1 : 请返回 /home/aaa/test.txt 的"test.txt”部分
控制台输入: basename /homelaaa/test.txt
输出:test.txt
控制台输入: basename /homelaaa/test.txt.txt
输出:test

》dirname 基本语法
功能:返回完整路径最后/的前面的部分,常用于返回路径部分
dirmame 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

》应用实例
案例1 : 请返回 /home/aaa/test.txt 的 /home/aaa
控制台输入:dirname  /home/aaa/test.txt
输出:/home/aaa

17.12.3 自定义函数

》基本语法
[ function ] funname[()]
{
     Action;
     [ return int;]
}

调用直接写函数名: funname [值]

》应用实例
案例1 : 计算输入两个参数的和(动态的获取),getSum
代码

#!/bin/bash
#案例1:计算输入两个参数的和(动态的获取), getSum

#定义函数getSum
function getSum() {
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
}
# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用自定义函数
getSum $nl $n2

17.13 Shell 编程综合案例

17.13.1 需求分析

(1)每天凌晨2:30备份数据库 hspedu  到  /data/backup/db
(2)备份开始和备份结束能够给出相应的提示信息
(3)备份后的文件要求以备份时间为文件名,并打包成  .tar.gz  的形式,
         比如 : 2021-03-12_230201.tar.gz
(4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
(5)画一个思路分析图

 

17.13.2 代码  /usr/sbin/mysql_db.backup.sh

#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=hspedu100
#备份的数据库名
DATABASE=hspedu

#创建备份目录,如果不存在,就创建
[ ! -d "${BACKUP}/${DATETIME}" ]&& mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库
mysqldump  -u${DB_USER} -p${DB_PW} --host=${HOST} -q  -R  --databases ${DATABASE} | gzip >${BACKUP}/${DATETIME}/$DATETIME.sql.gz

#将文件处理成tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz${DATETIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}

#删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf{}\; 
echo "备份数据库${DATABASE}成功~"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值