大数据之Shell脚本语言简单入门(打通任督二脉)

2023-11-22 10:20

本文主要是介绍大数据之Shell脚本语言简单入门(打通任督二脉),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一. Shell概述

Shell脚本其实是一个命令解释器,它接收的是应用程序的命令,然后调用操作系统内核。同时Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。Shell在Linux系统中的位置如下图所示:

二. Shell脚本入门

2.1 脚本格式与执行

Linux系统对于解释Shell命令提供了解析器,通过指令cat /etc/shells可以查看:

2.1.1 脚本输出HelloWorld

脚本以指定解析器#!/bin/bash开头,创建一个hello.sh文件的脚本,添加如下内容:

#!/bin/bash
echo "helloworld"

执行脚本方式一

bash hello.sh

bash直接加上文件名或者文件路径(绝对路径或者相对路径)执行

执行脚本方式二

不使用bash,进行当前环境下绝对路径执行对应的Sheel脚本,必须赋予可执行权限:

赋予权限后执行:

chmod +x /root/script/hello.sh

直接使用绝对路径执行脚本,就会输出helloworld:

/root/script/hello.sh

三. Shell脚本语法

3.1 系统预定义变量

3.1.1 常用系统变量  

比如$HOME,$PWD,$SHELL,$USER

查看系统变量的值使用echo:

echo $HOME

查看系统变量的所有Shell变量:

set

查看所有的系统环境变量使用env命令

3.2 自定义变量

3.2.1 基本语法

zs=14 # 定义变量zs
echo $zs # 获得zs值14

直接变量名=赋值,这种方式声明的只是局部变量,声明或升级全局变量使用export

export zs

zs已变成全局变量,如何定义只读变量?使用readonly

readonly zs=14

当自定义变量越来越多,可以进行撤销使用unset,只读变量不可撤销。

unset a

3.3 特殊变量

3.3.1 基本语法

1. $n n表示数字,$0表示脚本名称,当n大于10需用大括号包含:${10}。它表示的是第一到第n个参数。

看一个简单的例子,在执行脚本的时候可以在其后面设置值来让shell脚本输出对应的值:

#!/bin/bash
echo '========$n============'
echo script name: $0
echo param01: $1
echo param02: $2echo '===========$n===================='

执行成功后输出:

2. $#,获取所有参数个数,常用于循环,判断参数的个数是否正确加强脚本的健壮性。

还是上面的案例,统计出脚本执行后的变量数:

#!/bin/bash
echo '========$n============'
echo script name: $0
echo param01: $1
echo param02: $2echo '===========$n========='
echo numbers: $#

执行成功后输出:

3. $*与$@都是代表命令行中的所有参数,不同的就是$*将所有参数看做一个整体,$@则是将每个参数区分对待(了解自行验证)。

4. $?表示最后一次执行状态命令的返回状态,若此变量为0,表示脚本正常进行,若非0,则表示上一个脚本执行不正确。

3.4 运算符

对于shell脚本做运算,使用$[表达式]或者$((表达式))来表示计算两个数的和:

#!/bin/bash
sum=$[$1+$2]
echo sum=$sum

执行成功输入参数后:

3.5 条件判断

3.5.1 基本语法

用两种方式来进行表达式的条件判断,分别是

  • test 表达式
  • [ 表达式 ] 注意表达式前后都要有空格

第一种不常用,主要介绍第二种。

常见的判断条件有:

符号描述
-eq等于
-ne不等于
-lt小于
-le小于等于
-gt大于
-ge大于等于

例子:

[ 2 -lt 8 ]
[ 1 -eq 1 ]
[ 3 -ne 2 ]
[ 2 -le 5 ]
[ 6 -gt 5 ]

3.6 流程控制

关于流程控制主要分为单分支与多分支的操作。

3.6.1 单分支语法

if [ 条件判断 ];then程序
fi

或者

if [ 条件表达式 ]
then程序
fi

3.6.2 多分支语法

if [ 条件表达式 ]
then程序
elif [ 条件表达式 ]
then程序
else程序
fi

3.6.3 case语法

case $变量名 in
"值1")若目标值为1,执行程序1
;;
"值2")若目标值为2,执行程序2
;;...其它分支...
*)若变量的值都不是上面的值,则执行此程序
;;
esac

注意:

  1. ;;表示程序结束相当于java中的break
  2. *)表示默认的模式,相当于java的default

3.7 循环操作

3.7.1 for循环

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

例子:求前100的整数和

#!/bin/bash
for(( i=0; i <= $1 ; i++ ))
dosum=$[ $sum + $i ]
done
echo $sum

3.7.2 while循环

while [ 条件表达式 ]
do程序
done

例子:求前100的整数和

a=1
while [ a -le 100 ]
dosum=$[ $sum + $a ]a=$[ $a + 1]
done
echo $sum

3.8 函数

3.8.1 系统函数

1. basename

删除所有前缀包括最后一个"/"的字符 ,相当于提取文件名称,语法如下:

basename[ string / pathname ] suffix]

例:获取文件名,讲后缀去掉。

$(basename $0 .txt)

2. dirname

获取文件的绝对路径。

cd $(dirname $0)

3.8.2 自定义函数

基本语法:[ ]表示可以省略

[function] name[()]

{

        Action; 

        [return int;]

}

注意,函数必须事先声明,return只能返回0-255的数字。

例子:计算两数之和。

#!/bin/bash
function add(){s=$[$1 + $2]echo $s
}
read -p "输入a=" a
read -p "输入b=" b
sum=$(add $a $b)
echo "a+b="$sum

四. 综合应用案例

4.1 归档文件

在实际的生产应用中,需要对重要的数据进行归档备份,实现一个对指定目录进行归档备份的脚本,输入一个目录名称,将此目录下的文档按天进行归档保存,并将归档日期附加至归档的文件名上。

#!/bin/bash#首先判断输入参数是否是1
if [ $# -ne 1 ]
thenecho "参数个数错误,输入一个参数,作为文档目录名称"exit
fi# 从参数中获取目录名称
if [ -d $1 ]
thenecho
elseechoecho "目录不存在!"echoexit
fiDIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)# 获取当前日期
DATE=$(date +%y%m%d)#定义生成的归档文件名称
FILE=file_${DIR_NAME}_$DATE.tar.gz
DEST=/home/tongbing/$FILE#开始归档目录文件echo "开始归档..."
echotar -czf $DEST $DIR_PATH/$DIR_NAMEif  [ $? -eq 0 ]
thenechoecho "归档成功"echo "归档文件:$DEST"echofi

这篇关于大数据之Shell脚本语言简单入门(打通任督二脉)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409454

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp