Linux 之大数据定制篇-Shell 编程

news2024/11/23 12:20:29

Linux 之大数据定制篇-Shell 编程

为什么要学习Shell 编程

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

Shell 是什么

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

看一个示意图

在这里插入图片描述

Shell 脚本的执行方式

脚本格式要求

  1. 脚本以#!/bin/bash 开头
  2. 脚本需要有可执行权限

编写第一个Shell 脚本

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

  1. vim hello.sh
#!/bin/bash
echo "hello,world~"

脚本的常用执行方式

  1. 方式1(输入脚本的绝对路径或相对路径)

​ 说明:首先要赋予helloworld.sh 脚本的+x 权限, 再执行脚本

​ 比如./hello.sh 或者使用绝对路径/root/shcode/hello.sh

  1. 方式2(sh+脚本)

​ 说明:不用赋予脚本+x 权限,直接执行即可。

​ 比如sh hello.sh , 也可以使用绝对路径

Shell 的变量

Shell 变量介绍

  1. Linux Shell 中的变量分为,系统变量和用户自定义变量。

  2. 系统变量:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等..
    
  1. 显示当前shell 中所有变量:set

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=$A
echo "A=$A"
#案例2:撤销变量A
unset A
echo "A=$A"
#案例3:声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"
#unset B

shell 变量的定义

定义变量的规则

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

将命令的返回值赋给变量

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

列如

C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"

设置环境变量

基本语法

  1. export 变量名=变量值(功能描述:将shell 变量输出为环境变量/全局变量)
  2. source 配置文件(功能描述:让修改后的配置信息立即生效)
  3. echo $变量名(功能描述:查询环境变量的值)

在这里插入图片描述

快速入门

  1. 在/etc/profile 文件中定义TOMCAT_HOME 环境变量
  2. 查看环境变量TOMCAT_HOME 的值
  3. 在另外一个shell 程序中使用TOMCAT_HOME

在这里插入图片描述

**注意:**在输出TOMCAT_HOME 环境变量前,需要让其生效source /etc/profile

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

shell 脚本的多行注释

:<<!

 内容

!

位置参数变量

介绍

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

基本语法

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

位置参数变量

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

在这里插入图片描述

预定义变量

基本介绍

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

基本语法

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

应用实例

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

名字为preVar.sh

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

运算符

基本介绍

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

基本语法

  1. “$((运算式))”或“

    $[运算式]”或者expr m + n //expression 表达式

  2. 注意expr 运算符间要有空格, 如果希望将expr 的结果赋给某个变量,使用``

  3. expr m - n

  1. expr *, /, % 乘,除,取余

应用实例

oper.sh

.案例1:计算(2+3)X4 的值

案例2:请求出命令行的两个参数[整数]的和20 50

#!/bin/bash
#案例1:计算(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"

条件判断

判断语句

基本语法

[ condition ](注意condition 前后要有空格)

#非空返回true,可使用$?验证(0 为true,>1 为false)

应用实例

[ wyx ] 返回true
[ ] 返回false
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句

判断语句

常用判断条件

  1. = 字符串比较
  2. 两个整数的比较
    -lt 小于
    -le 小于等于little equal
    -eq 等于
    -gt 大于
    -ge 大于等于
    -ne 不等于
  1. 按照文件权限进行判断3

    -r 有读的权限
    -w 有写的权限
    -x 有执行的权限

  2. 按照文件类型进行判断
    -f 文件存在并且是一个常规的文件
    -e 文件存在
    -d 文件存在并是一个目录

应用实例

案例1:“ok"是否等于"ok”

判断语句:使用=

案例2:23 是否大于等于22

判断语句:使用-ge

案例3:/root/shcode/aaa.txt 目录中的文件是否存在

判断语句: 使用-f

#!/bin/bash
#案例1:"ok"是否等于"ok"
#判断语句:使用 =
if [ "ok" = "ok" ]
then
	echo "equal"
fi
#案例2:23是否大于等于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then 
	echo "大于"
fi
#案例3:/root/shcode/aaa.txt 目录中的文件是否存在
#判断语句: 使用 -f 
if [ -f /root/shcode/aaa.txt ]
then 
	echo "存在"
fi
#看几个案例
if [ wyx ]
then 
	echo "hello,wyx"
fi

流程控制

if 判断

基本语法
if [ 条件判断式]
then
代码
fi

或者, 多分支

if [ 条件判断式]
then
代码
elif [条件判断式]
then
代码
fi

注意事项:[ 条件判断式],中括号和条件判断式之间必须有空格

应用实例

ifCase.sh

案例:请编写一个shell 程序,如果输入的参数,大于等于60,则输出"及格了",如果小于60,则输出"不及格"

#!/bin/bash
#案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出 "及格了",如果小于60,则输出 "不及格"
if [ $1 -ge 60 ]
then 
	echo "及格了"
elif [ $1 -lt 60 ] 
then
	echo "不及格"
fi

case 语句

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

应用实例

testCase.sh

案例1 :当命令行参数是1 时,输出"周一", 是2 时,就输出"周二", 其它情况输出"other"

#!/bin/bash
#案例1 :当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出  "other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac

for 循环

基本语法1

for 变量in 值1 值2 值3…
do
程序/代码
done

应用实例testFor1.sh

案例1 :打印命令行输入的参数[这里可以看出 ∗ 和 * 和 @ 的区别]

#!/bin/bash
#案例1 :打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
#注意 $* 是把输入的参数,当做一个整体,所以,只会输出一句
for i in "$*"
do 
	echo "num is $i"
done
#使用 $@来获取输入的参数,注意,这时是分别对待,所以有几个参数,就输出几句
echo "======================================"
for j in "$@"
do
	echo "num is $j"
done

基本语法2

for (( 初始值;循环控制条件;变量变化))
do
程序/代码
done

应用实例

testFor2.sh

案例1 :从1 加到100 的值输出显示

#!/bin/bash
#案例1 :从1加到100的值输出显示, 如何把 100做成一个变量
#定义一个变量 SUM
SUM=0
for(( i=1; i<=$1; i++))
do
#写上你的业务代码
	SUM=$[$SUM+$i]
done
echo "总和SUM=$SUM"

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"

read 读取控制台输入

基本语法

read(选项)(参数)

选项:

​ -p:指定读取值时的提示符;

​ -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。

参数

变量:指定读取值的变量名

应用实例

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"

函数

函数介绍

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

系统函数

basename 基本语法

功能:返回完整路径最后/ 的部分,常用于获取文件名

basename [pathname] [suffix]

basename [string] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项:

suffix 为后缀,如果suffix 被指定了,

basename 会将pathname 或string 中的suffix 去掉。

dirname 基本语法

功能:返回完整路径最后/ 的前面的部分,常用于返回路径部分

dirname 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

应用实例

  1. 案例1:请返回/home/aaa/test.txt 的"test.txt" 部分

     ​		basename /home/aaa/test.txt
    
  2. 案例1:请返回/home/aaa/test.txt 的/home/aaa

     	dirname /home/aaa/test.txt
    

自定义函数

基本语法
[ 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 $n1 $n2

Shell 编程综合案例

需求分析

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

在这里插入图片描述

代码

#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=#自己的密码
#备份的数据库名
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} 成功~"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mocha AE:图层相关面板

Mocha AE 左侧的图层面板、图层属性面板以及边缘属性面板提供了与图层、样条、跟踪等相关的选项。 Layers 图层 图层的上下顺序相当重要。 上方所有图层的样条区域将被自动排除出跟踪遮罩 Track Mattes。 也可在同一图层上绘制多个样条形状。相交的样条区域将被排除出遮罩。 Vi…

【MySQL】一文带你了解MySQL中的子查询

文章目录 1. 需求分析与问题解决1. 1实际问题1.2 子查询的基本使用1.3 子查询的分类 2. 单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING 中的子查询2.4 注意的问题 3. 多行子查询3.1 多行比较操作符3.2 代码示例 4. 相关子查询4.1 相关子查询执行流程4.2 代码示例 子查询…

图论学习(六)

图的连通度 删去任意一条边后便不连通 删去任意一条边后仍连通&#xff0c;但删去点u后不连通。 G3和G4删去任意一条边或任意一个点后仍连通&#xff0c;但从直观上看&#xff0c;G4的连通程度比G3高。 割边 设e是图G的一条边&#xff0c;若ω(G-e)>ω(G)&#xff0c;则…

uniapp微信一键登录微信授权

前言 现在小程序逐渐成为主流&#xff0c;常用的微信授权登录很重要很常见的一个功能&#xff0c;今天自己总结了一下。 准备工作 1.如果你想自己想试一下这个功能首先你需要有一个开发中的项目并且你在开发成员里面。 2.配置自己的微信开发者工具的appid码 3.在hbuilderx的…

echarts 如何实现图例单个数据项加上背景颜色和饼图中的背景图自适应

需求: 实现效果如下: ECharts中,可以通过设置legend中的formatter属性来自定义图例项的显示格式。以下是一个示例: option = {// ...legend: {data: [A, B, C],formatter: function (name) {var color = #fff;if (name === A) {color = #ff0000; // 设置A的背景颜色为红色…

如何使用ArcGIS计算容积率

字段计算 为建筑图层新建一个area字段&#xff0c;用于记录单层建筑的面积&#xff0c;如下图所示。 单层建筑面积 为建筑图层新建一个areaAll字段&#xff0c;用于记录总建筑面积&#xff0c;areaAllarea*floor&#xff0c;如下图所示。 计算总面积 为小区图层新建一个area…

chatgpt赋能python:Python大于0的SEO

Python大于0的SEO Python是一种高级编程语言&#xff0c;被广泛用于数据科学、机器学习、Web应用程序和网络爬虫等领域。Python大于0的SEO是指使用Python编写程序来优化网站的排名。在本文中&#xff0c;我们将介绍Python大于0的SEO的基础知识和一些实用技巧。 什么是Python大…

【redis基础】哨兵

hi,这里是redis系列文章&#xff0c;本篇是【redis基础】哨兵&#xff0c;上一篇链接&#xff1a;【redis】redis主从复制_努力努力再努力mlx的博客-CSDN博客 目录 概念 作用 如何使用哨兵&#xff08;案例演示实战步骤&#xff09; redis sentinel架构提前说明 重点参数…

【Java】Java(四十九):注解及自定义注解

文章目录 什么是注解&#xff1f;概述注解的作用自定义注解注解的定义格式带有属性的注解 注解的使用注解的使用格式 元注解元注解的作用&#xff1a;常用元注解&#xff1a; 注解解析 什么是注解&#xff1f; 注解(Annotation)也称为元数据&#xff0c;是一种代码级别的说明注…

数据库管理-第八十期 Exadata to RAC(x86) ADG(20230605)

数据库管理 2023-06-05 第八十期 Exadata to RAC(x86) ADG1 环境2 搭建流程2.1配置静态监听-主库2.2配置静态监听-备库2.3配置本地命名-主备库2.4数据库配置-主库2.5生成参数文件和密码文件-主库2.6创建目录并上传密码文件-备库2.7添加数据库服务-备库2.8修改参数文件-备库2.9复…

超级智能的治理

原文链接&#xff1a;https://openai.com/blog/governance-of-superintelligence#SamAltman 作者丨Sam Altman&#xff0c;Greg Brockman&#xff0c;Ilya Sutskever 译者 | Ted Liu 审校 | LsssY 编辑丨肖钰雯 现在是开始思考超级智能治理的好时机--未来的人工智能系统甚至比通…

基于SpringBoot+vue的租房网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Python中的Time和DateTime

Python在处理与时间相关的操作时有两个重要模块&#xff1a;time和datetime。在本文中&#xff0c;我们介绍这两个模块并为每个场景提供带有代码和输出的说明性示例。 time模块主要用于处理时间相关的操作&#xff0c;例如获取当前时间、时间的计算和格式化等。它提供了一些函数…

老胡的周刊(第093期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 dm-ticket[2] 大麦网自动购票, 支持 docker …

4、数据库:MySQL部署 - 系统部署系列文章

MySQL数据库在其它博文中有介绍&#xff0c;包括学习规划系列。今天就讲讲MySQL的部署事情。 一、先下载MySQL数据库&#xff1b; 到下面这个网址去下载数据库&#xff0c;这里下载的社区版&#xff1a; https://dev.mysql.com/downloads/installer/ 二、安装数据库&#xff1b…

读改变未来的九大算法笔记04_公钥加密

1. 加密的目的就是传输秘密 2. 分块密码&#xff08;Block Cipher&#xff09;的现代加密技术使用了相加把戏的变体 2.1. 加法得出的结果能用于统计分析&#xff0c;这意味着一些人能通过分析你的大量加密消息来得到密钥 2.2. 任何知道密钥的人都能用相反的步骤运行所有操作…

MathType7中文标准版数学公式编辑工具

MathType 是一款专业的数学公式编辑工具,提供交互式编辑器&#xff0c; 让你在编辑数学试卷、书籍、报刊、论文、幻灯演示等文档轻松输入各种复杂的数学公式和符号。当您准备坐下来撰写科学或技术论文&#xff0c;测试&#xff0c;幻灯片演示文稿或任何想要包括数学符号的地方时…

互联网野蛮生长,但金三银四好像消失了!

每次看到程序员字眼&#xff0c;就是秃头&#xff0c;肥胖&#xff0c;宅男、996&#xff0c;程序员&#xff0c;但是耐不住工资高啊&#xff01;但只有程序员才知道&#xff0c;干IT的&#xff0c;都有一个自己的程序员梦&#xff0c;梦想着能用 “代码改变世界”。 代码能不…

音视频实战开源项目学习第二期!

前言&#xff1a; 大家好&#xff0c;今天继续分享音视频开源学习第二期&#xff0c;在前面的一期里面&#xff0c;我已经给大家演示了如何去跑起这个开源项目&#xff0c;包括源码下载&#xff1b; 音视频实战开源项目学习第一期&#xff01; 今天继续来讲解这个开源项目。 不…

chatgpt赋能python:Python多行连一行:简便省事的代码优化方法

Python多行连一行&#xff1a;简便省事的代码优化方法 在Python编程中&#xff0c;经常会遇到多行代码的情况&#xff0c;这不仅降低了代码的可读性&#xff0c;也增加了调试的难度。为了解决这个问题&#xff0c;Python提供了多行连一行&#xff08;以反斜杠\结尾&#xff09…