深入浅出Linux操作系统大数据定制Shell编程(六)

深入浅出Linux操作系统大数据定制Shell编

  • 1、大数据定制-Shell编程
    • 1.1、什么是Shell
    • 1.2、Shell脚本执行方式
  • 2、Shell变量
    • 2.1、shell变量的定义
      • 2.1.1、设置环境变量
      • 2.1.2、多行注释
    • 2.2、位置参数变量
      • 2.2.1、语法
    • 2.3、预定义变量
    • 2.4、运算符
      • 2.4.1、条件判断
      • 2.4.2、case语句
      • 2.4.3、for循环
      • 2.4.4、while循环
    • 2.5、read读取控制台输入
  • 3、函数
    • 3.1、系统函数
    • 3.2、自定义函数
  • 4、备份案例

1、大数据定制-Shell编程

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

1.1、什么是Shell

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

1.2、Shell脚本执行方式

脚本格式要求:

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

例子:创建一个Shell脚本,输出 Hello World!

#! /bin/bash
echo "Hello World!"

在这里插入图片描述

  • 进入文件所在目录执行脚本: sh 文件名
sh hello.sh

在这里插入图片描述

2、Shell变量

  1. Linux Shell 中的变量分为: 系统变量、用户自定义变量
  2. 系统变量:
    • $HOME$PWD$SHELL$USER
    • 例如: echo $HOME

在这里插入图片描述

  1. 显示当前shell中的所有变量 : set

2.1、shell变量的定义

语法:

  • 定义变量: 变量名=值

  • 撤销变量: unset 变量

  • 声明静态变量: readonly 变量 ,不能 unset

#! /bin/bash
# 1. 定义变量
A=100
# 输出变量需要加上 $
echo A=$A
echo "A=$A"# 2.撤销变量A
unset A
echo "A=$A"# 声明静态变量 B=2
readonly B=2
echo "B=$B"

在这里插入图片描述

定义变量的规则:

  1. 变量名称可有字母、数字和下划线组成,但是不能以数字开头。
  2. 等号两侧不能有空格
  3. 变量名称一般习惯大写,这是一个规范

将命令的返回值赋给变量:

# 将指令返回的结果赋给变量
# 将 date 指令返回的结果赋给变量
A=$(date)
# 等价于
A=`data`
echo A

在这里插入图片描述

2.1.1、设置环境变量

语法:

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

例子:

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

在这里插入图片描述

# 2. 刷新配置文件
source /etc/profile# 3. 输出自定义环境变量
echo $TOMCAT_HOME

在这里插入图片描述

我们在其他 shell 脚本中使用这个自定义环境变量:

echo  "tomcat_home=$TOMCAT_HOME"

在这里插入图片描述

2.1.2、多行注释

# shell 脚本的多行注释
:<<! 多行注释!

2.2、位置参数变量

当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。

例如:

# 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
sh hello.sh 100 200

2.2.1、语法

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

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

#! /bin/bash
echo "命令本身=$0 第一个参数=$1 第二个参数=$2"
echo "所有的参数整体=$*"
echo "所有的参数区分:$@"
echo "参数的个数=$#"

在这里插入图片描述

2.3、预定义变量

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

语法:

  • $$ : 当前进程的进程号 PID

  • $! : 后台运行的最后一个进程的进程号 PID

  • $? :最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确

示例:pre.sh

#!/bin/bash
echo "当前执行的进程id=$$"
# 以后台的方式运行一个脚本,并获取他的进程号(一个脚本调用另一个脚本)
/www/kuang/shell/position.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是$?"

在这里插入图片描述

2.4、运算符

  • $((运算式))$[运算式]

示例:

#! /bin/bash
# 1.计算(2+3)×4的值res=$[(2+3)*4]echo "res=$res"# 2.请求出命令行的两个参数的和 20 50
sum=$[$1+$2]
echo "sum=$sum"

在这里插入图片描述

2.4.1、条件判断

语法:

  • [ condition ] : 注意 condition 前后要有空格
  • 非空返回 true,可使用 $? 验证,0为true,>1 为false

常用判断条件:

  1. = 字符串比较
  2. 两个整数的比较
  3. -lt 小于
  4. -le 小于等于
  5. -eq 等于
  6. -gt 大于
  7. -ge 大于等于
  8. -ne 不等于

按照文件权限进行判断:

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

按照文件类型进行判断:

  • -f 文件存在并且是一个常规的文件
  • -e 文件存在
  • -d 文件存在并且是一个目录

语法:

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

[ 条件判断式 ] 中括号和条件判断式之间必须有空格

#! /bin/bash
# 1.判断 ok 是否 等于 ok
if [ "ok" = "ok" ]
then echo "equal"
fi# 2.判断23是否大于等于22
if [ 23 -ge 22 ]
thenecho "大于"
fi# 3. /www/shell/hello.sh 目录中的文件是否存在
if [ -f /www/shell/hello.sh ]
thenecho "存在"
fi# 4.中括号里面有内容,默认为真
if [ qinxiaolin ]
thenecho "hello,qinxiaolin"
fi

在这里插入图片描述

2.4.2、case语句

语法:

case $变量名 in 
"值1")
echo "如果变量的值等于值1,则执行1"
;;
"值2")
echo "如果变量的值等于值2,则执行2"
;;
*)
echo "如果变量的值都不是以上的值,则执行此程序"
;;
esac

示例:当命令行参数是1时,输出周一,是二时,输出周二

#! /bin/bash
# 当命令行参数是1时,输出周一
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

在这里插入图片描述

2.4.3、for循环

语法:

# 语法一
for 变量 in 值1 值2 值3
do
代码
done# 语法二
for((初始值;循环控制条件;变量变化))
do
代码
done

示例:

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

在这里插入图片描述

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

#! /bin/bash
# 定义一个变量sum
sum=0
for(( i=1; i<=$1; i++))
dosum=$[$sum+$i]
done
echo "总和sum=$sum"

在这里插入图片描述

2.4.4、while循环

语法:

# while 和 [ 有空格,条件表达式和 [ 也有空格
while [ 条件表达式 ]
do
代码
done

示例:

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

在这里插入图片描述

2.5、read读取控制台输入

语法:read(选项)(参数)

选项:

  • -p : 指定读取值时的提示符
  • -t: 指定读取值时等待的时间,如果没有在指定的时间内输入,就不再等待了

参数:

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

示例:

#! /bin/bash
#1. 读取控制台输入一个 num1 值
read -p "请输入一个数num1=" num1
echo "你输入的num1=$num1"#2.读取控制台输入一个num2值,请在10s内输入
read -t 10 -p "请输入一个数num2=" num2
echo "你输入的num2=$num2"

在这里插入图片描述

3、函数

3.1、系统函数

basename语法:

  • basename[pathname][suffix] :返回完整路径最后 /的部分,常用于获取文件名
  • basename[string][suffix] :basename 命令会删掉所有的前缀包括最后一个 / 字符,然后将字符串显示出来

选项:

  • suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉
#! /bin/bash
#1. 返回 /www/shell/test.txt 的 "hello.txt" 部分
basename /www/kuang/shell/hello.txt#2.返回 /www/shell/test.txt 的 "hello" 部分
basename /www/kuang/shell/hello.txt .txt

在这里插入图片描述

dirname 语法:返回完整路径最后 / 的前面的部分,常用于返回路径部分

  • dirname 文件绝对路径:从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径

示例:

# 请返回 /www/kuang/shell/hello.txt 的/www/kuang/shell/
dirname  /www/kuang/shell/hello.txt

在这里插入图片描述

3.2、自定义函数

语法:

# 1.定义
[ function ]funname[()]
{Action;[return int;]
}# 2.调用
funname []

示例:

#! /bin/bash
#1. 计算输入两个参数的和(动态的获取),getSum
# 定义函数
function getSum(){sum=$[$n1+$n2]echo "和是=$sum"
}# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
# 调用自定义函数
getSum $n1 $n2

在这里插入图片描述

4、备份案例

  1. 每天凌晨 2.30 备份数据库 shelldb 到 /www/service/db
  2. 备份开始和备份结束能够给出相应的提示信息
  3. 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如 :2023-11-24_xxxx.tar.gz
  4. 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
# 备份目录
BACKUP= /www/service/db
# 当前时间
DATETIME=$(date +"%Y-%m-%d %H:%M:%S")
echo $DATETIME# 数据库的地址
HOST=localhost# 数据库用户名
DB_USER=root# 数据库密码
DB_PW=qxl666nb# 备份的数据库名
DATABASE=shelldb# 如果不存在就创建备份目录
[! -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天前的备份文件(查找所有在过去10天内没有被访问过且文件名为.tar.gz结尾的文件,并将它们强制删除)
find ${BACKUP} -atime+10 -name "*.tar.gz" -exec rm -rf {}
echo "备份数据库${DATABASE} 成功!"

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

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

相关文章

SQL-leetcode—1174. 即时食物配送 II

1174. 即时食物配送 II 配送表: Delivery ------------------------------------ | Column Name | Type | ------------------------------------ | delivery_id | int | | customer_id | int | | order_date | date | | customer_pref_delivery_date | date | -------------…

C#AWS signatureV4对接Amazon接口

马上要放假了&#xff0c;需要抓紧时间测试对接一个三方接口&#xff0c;对方是使用Amazon服务的&#xff0c;国内不多见&#xff0c;能查的资(代)料(码)&#xff0c;时间紧比较紧&#xff0c;也没有时间去啃Amazon的文档&#xff0c;主要我的英文水平也不行&#xff0c;于是粗…

30289_SC65XX功能机MMI开发笔记(ums9117)

建立窗口步骤&#xff1a; 引入图片资源 放入图片 然后跑make pprj new job8 可能会有bug,宏定义 还会有开关灯报错&#xff0c;看命令行注释掉 接着把ture改成false 然后命令行new一遍&#xff0c;编译一遍没报错后 把编译器的win文件删掉&#xff0c; 再跑一遍虚拟机命令行…

“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““

主题与背景 本文主要介绍了如何在R语言中使用predict函数对已拟合的Cox比例风险模型进行新数据的预测和推理。Cox模型是一种常用的生存分析方法&#xff0c;用于评估多个因素对事件发生时间的影响。文章通过具体的代码示例展示了如何使用predict函数的不同参数来获取生存概率和…

Effective Objective-C 2.0 读书笔记—— objc_msgSend

Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文…

验证二叉搜索树(力扣98)

根据二叉搜索树的特性&#xff0c;我们使用中序遍历&#xff0c;保证节点按从小到大的顺序遍历。既然要验证&#xff0c;就是看在中序遍历的条件下&#xff0c;各个节点的大小关系是否符合二叉搜索树的特性。双指针法和适合解决这个问题&#xff0c;一个指针指向当前节点&#…

【竞技宝】LPL:IG3-1击败RNG

北京时间1月26日&#xff0c;英雄联盟LPL2025正在如火如荼的进行之中&#xff0c;昨日共进行两场比赛。第二场比赛由RNG对阵IG。本场比赛&#xff0c;RNG在首局前期打出完美节奏后一直压制着IG拿下比赛&#xff0c;但此后的三局&#xff0c;IG发挥出自己擅长大乱斗的能力在团战…

web3py+flask+ganache的智能合约教育平台

最近在学习web3的接口文档&#xff0c;使用web3pyflaskganache写了一个简易的智能合约教育平台&#xff0c;语言用的是python&#xff0c;ganche直接使用的本地区块链网络&#xff0c;用web3py进行交互。 代码逻辑不难&#xff0c;可以私信或者到我的闲鱼号夏沫mds获取我的代码…

使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化

使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化 前言环境准备运行 Oracle Database 23ai Free 容器基本命令参数说明示例 注意事项高级配置参数说明 总结 前言 Oracle Database 23ai Free 是 Oracle 提供的免费版数据库&#xff0c;基于 Oracle …

JAVA(SpringBoot)集成Kafka实现消息发送和接收。

SpringBoot集成Kafka实现消息发送和接收。 一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者 君子之学贵一&#xff0c;一则明&#xff0c;明则有功。 一、Kafka 简介 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台&#xff0c;最初由 Link…

Spring Boot 无缝集成SpringAI的函数调用模块

这是一个 完整的 Spring AI 函数调用实例&#xff0c;涵盖从函数定义、注册到实际调用的全流程&#xff0c;以「天气查询」功能为例&#xff0c;结合代码详细说明&#xff1a; 1. 环境准备 1.1 添加依赖 <!-- Spring AI OpenAI --> <dependency><groupId>o…

媒体新闻发稿要求有哪些?什么类型的稿件更好通过?

为了保证推送信息的内容质量&#xff0c;大型新闻媒体的审稿要求一向较为严格。尤其在商业推广的过程中&#xff0c;不少企业的宣传稿很难发布在这些大型新闻媒体平台上。 媒体新闻发稿要求有哪些&#xff1f;就让我们来了解下哪几类稿件更容易过审。 一、媒体新闻发稿要求有哪…

ui-automator定位官网文档下载及使用

一、ui-automator定位官网文档简介及下载 AndroidUiAutomator&#xff1a;移动端特有的定位方式&#xff0c;uiautomator是java实现的&#xff0c;定位类型必须写成java类型 官方地址&#xff1a;https://developer.android.com/training/testing/ui-automator.html#ui-autom…

ThreadLocal概述、解决SimpleDateFormat出现的异常、内存泄漏、弱引用、remove方法

①. ThreadLocal简介 ①. ThreadLocal是什么 ①. ThreadLocal本地线程变量,线程自带的变量副本(实现了每一个线程副本都有一个专属的本地变量,主要解决的就是让每一个线程绑定自己的值,自己用自己的,不跟别人争抢。通过使用get()和set()方法,获取默认值或将其值更改为当前线程…

总结8..

#include <stdio.h> // 定义结构体表示二叉树节点&#xff0c;包含左右子节点编号 struct node { int l; int r; } tree[100000]; // 全局变量记录二叉树最大深度&#xff0c;初始为0 int ans 0; // 深度优先搜索函数 // pos: 当前节点在数组中的位置&#xff0c…

科普篇 | “机架、塔式、刀片”三类服务器对比

一、引言 在互联网的世界里&#xff0c;服务器就像是默默运转的超级大脑&#xff0c;支撑着我们日常使用的各种网络服务。今天&#xff0c;咱们来聊聊服务器家族中的三位 “明星成员”&#xff1a;机架式服务器、塔式服务器和刀片式服务器。如果把互联网比作一座庞大的城市&…

动手学图神经网络(2):跆拳道俱乐部案例实战

动手学图神经网络(2):跆拳道俱乐部案例实战 在深度学习领域,图神经网络(GNNs)能将传统深度学习概念推广到不规则的图结构数据,使神经网络能够处理对象及其关系。将基于 PyTorch Geometric 库,一步步探索图神经网络的奥秘。 安装必要的包 首先, 安装所需的 Python 包…

【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件

一、概述 本示例实现了一个基于 Vue3 和 TypeScript 的断点上传功能。该功能支持文件分块上传&#xff0c;能够在上传过程中暂停、继续上传&#xff0c;并且支持检测已经上传的分块&#xff0c;避免重复上传&#xff0c;提升上传效率。以下是关键的技术点与实现流程&#xff1…

OpenCV 版本不兼容导致的问题

问题和解决方案 今天运行如下代码&#xff0c;发生了意外的错误&#xff0c;代码如下&#xff0c;其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…

Day25-【13003】短文,什么是算法?如何衡量时间复杂度?什么是最优,平均时间复杂度?

文章目录 第二节概览什么是算法&#xff1f;算法的5个特性&#xff1f; 算法如何评估&#xff1f;时间指标如何衡量&#xff1f;算法的复杂度如何度量&#xff1f;算法开销上限和下限如何表示&#xff1f;什么是常数复杂度&#xff1f;线性操作&#xff1f;对数复杂度-线性对数…