深入浅出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,一经查实,立即删除!

相关文章

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 尾调用优化总结参考文…

【竞技宝】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获取我的代码…

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

为了保证推送信息的内容质量&#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;机架式服务器、塔式服务器和刀片式服务器。如果把互联网比作一座庞大的城市&…

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

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

python基础语法(3) -------- 学习笔记分享

目录: 1. 函数 1.1 语法格式 1.2 函数参数 1.3 函数返回值 1.4 变量的作用域 1.5 函数的执行过程 1.6 函数的链式调用 1.7 函数的嵌套调用 1.8 函数递归 1.9 参数默认值 1.10 函数的关键字传参 2. 列表和元组 2.1 列表和元组是啥 2.2 创建列表 2.3 访问下标 2.…

磐维数据库PanWeiDB2.0日常维护

磐维数据库简介 “中国移动磐维数据库”&#xff08;ChinaMobileDB&#xff09;&#xff0c;简称“磐维数据库”&#xff08;PanWeiDB&#xff09;。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。 其产品内核能力基于华为 OpenG…

Linux:文件与fd(未被打开的文件)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;文件与fd&#xff08;未被打开的文件&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xf…

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考&#xff1a; 前言 对多传感器数据…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站&#xff0c;所以突发奇想&#xff0c;在本地装个WordPress玩玩吧&#xff0c;就尝试着装了一下&#xff0c;因为之前电脑上就有MySQL&#xff0c;所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题&#xff0c;也就是启动过…

写一个存储“网站”的网站前的分析

要创建一个能够存储自己网站内容的“网站”,通常意味着你希望有一个可以存储网站数据、文件、内容等信息的系统。为了实现这一目标,可以考虑构建一个内容管理系统(CMS),这个系统能够帮助你存储和管理网站上的内容。 图片仅供参考 以下是如何实现一个可以存储自己网站内容…

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

KIMI K1.5:用大语言模型扩展强化学习(论文翻译)

文章目录 KIMI K1.5技术报告摘要 1. 引言2. 方法&#xff1a;基于大语言模型的强化学习2.1 强化学习提示集整理2.2 长思维链监督微调2.3 强化学习2.3.1 问题设定2.3.2 策略优化2.3.3 长度惩罚2.3.4 采样策略2.3.5 训练方法的更多细节 2.4 长到短&#xff1a;短思维链模型的上下…