Spark修炼之道(基础篇)——Linux大数据开发基础:第十节:Shell编程入门(二)

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 参考书目:linux shell scripting cookbook本节主要内容shell命令行中的基本运算文件描述符与文件重定向1. shell命令行中的基本运算通过上一节我们知道,Linux Bash shell 命令行的变量都被解析成字符串,如//变量被解析为字符串root@sparkmaster:~/ShellLearning/cha

参考书目:linux shell scripting cookbook

本节主要内容

  1. shell命令行中的基本运算
  2. 文件描述符与文件重定向

1. shell命令行中的基本运算

通过上一节我们知道,Linux Bash shell 命令行的变量都被解析成字符串,如

//变量被解析为字符串
root@sparkmaster:~/ShellLearning/chapter09# first=1
root@sparkmaster:~/ShellLearning/chapter09# second=2

//并不会进行加法操作,而是两个字符串拼接
root@sparkmaster:~/ShellLearning/chapter09# $first+$second
1+2: command not found

那如何要进行基本的加减乘除等运算,怎么办呢?有三种命令可以做到,它们是let, (( )), and []。先来看一下let命令

//使用let命令,会进行加法运算
root@sparkmaster:~/ShellLearning/chapter09# let result=first+second

root@sparkmaster:~/ShellLearning/chapter09# echo $result
3

let命令还提供c、c++风格的自增、自减等操作,如:

root@sparkmaster:~/ShellLearning/chapter09# first=2
root@sparkmaster:~/ShellLearning/chapter09# $first
2: command not found
//自增操作
root@sparkmaster:~/ShellLearning/chapter09# let first++
root@sparkmaster:~/ShellLearning/chapter09# echo ${first}
3
//自减操作
root@sparkmaster:~/ShellLearning/chapter09# let first--
root@sparkmaster:~/ShellLearning/chapter09# echo ${first}
2
//相当于let first=first+10
root@sparkmaster:~/ShellLearning/chapter09# let first+=10
root@sparkmaster:~/ShellLearning/chapter09# echo ${first}
12
//相当于let first=first-10,其它操作如乘、除类似
root@sparkmaster:~/ShellLearning/chapter09# let first-=10
root@sparkmaster:~/ShellLearning/chapter09# echo ${first}
2

[]命令的功能与let命令类似,如

root@sparkmaster:~/ShellLearning/chapter09# first=5
root@sparkmaster:~/ShellLearning/chapter09# second=6
root@sparkmaster:~/ShellLearning/chapter09# result=$[first+second]
root@sparkmaster:~/ShellLearning/chapter09# echo $result 
11
//result=$[$first+$second]与result=$[first+second]等同
root@sparkmaster:~/ShellLearning/chapter09# result=$[$first+$second]
root@sparkmaster:~/ShellLearning/chapter09# echo $result 
11

也可以使用(( )) 命令进行,如:

root@sparkmaster:~/ShellLearning/chapter09# reslut=$((first+second))
root@sparkmaster:~/ShellLearning/chapter09# echo $result 
11

需要注意的是上述命令只对整型数值有效,不适用于浮点数

root@sparkmaster:~/ShellLearning/chapter09# result=$[first+second]
bash: 5.5: syntax error: invalid arithmetic operator (error token is ".5")

root@sparkmaster:~/ShellLearning/chapter09# let resul=first+second
bash: let: 5.5: syntax error: invalid arithmetic operator (error token is ".5")

如果有浮点数参与运算,可以将echo与bc命令结合起来使用,代码如下:

root@sparkmaster:~/ShellLearning/chapter09# echo "$first+$second" | bc
12.0
root@sparkmaster:~/ShellLearning/chapter09# echo "$first*$second" | bc
35.7

2. 文件描述符与文件重定向

在Linux操作系统当中,文件描述符(File descriptors )与文件的输入输出相关,用整数表示,最常用的三种文件描述符号为stdin、stdout及stderr。stdin表示标准输入(standard input),文件描述符为0;stdout表示标准输出(standard output),文件描述符为1;stderr表示标准错误(standard error),文件描述为2。
标准输出指的是命令执行正常时显示到终端的信息,如

//stdout
root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 1" 
Shell Scripting 1

标准错误指的是命令执行异常时显示到终端的信息,如

//stderr
root@sparkmaster:~/ShellLearning/chapter10# cat ls
cat: ls: No such file or directory

如果不想将这些信息输出到终端,而是输出到文件中保存起来,这时就需要用到重定向,具体代码如下:

//利用>命令将标准输出重定向输出到文件,>命令首先清空shell.txt文件
//然后将信息写到文件当中,相当于覆盖了以前文件的内容
root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 1" > shell.txt
//以追加的方式将标准输出重定向到文件
root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 2" >> shell.txt
root@sparkmaster:~/ShellLearning/chapter10# cat shell.txt 
Shell Scripting 1
Shell Scripting 2

刚提到echo “Shell Scripting 1” > shell.txt命令是将标准输出(文件描述符为1)重定向到文件shell.txt当中,它其实相当于echo “Shell Scripting 1” 1> shell.txt,只不过默认可以省略:

root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 1" 1> shell2.txt 
root@sparkmaster:~/ShellLearning/chapter10# cat shell2.txt 
Shell Scripting 1

同样标准错误输出也可以重定向到文件当中,与标准输出重定向不同的是,其文件描述符不能省略

//2>将标准错误信息重定向到文件中,这里的文件描述符2不能省略
root@sparkmaster:~/ShellLearning/chapter10# cat ls 2> shellError.txt
root@sparkmaster:~/ShellLearning/chapter10# cat shellError.txt 
cat: ls: No such file or directory

//标准错误的文件描述符2不能省略,因为省略的话默认是标准输出
//会将错误信息输出到终端
root@sparkmaster:~/ShellLearning/chapter10# cat ls > shellError.txt
cat: ls: No such file or directory

重定向时可以根据将重定向命令结合起来使用,如

//cmd命令无效,会产生标准错误,此时错误信息会重定向到文件stderr.txt文件当中
root@sparkmaster:~/ShellLearning/chapter10# cmd 2>stderr.txt 1>stdout.txt
root@sparkmaster:~/ShellLearning/chapter10# cat stderr.txt 
No command 'cmd' found, did you mean:
 Command 'dcmd' from package 'devscripts' (main)
 Command 'wmd' from package 'wml' (universe)
 Command 'tcmd' from package 'tcm' (universe)
 Command 'cmp' from package 'diffutils' (main)
 Command 'qcmd' from package 'renameutils' (universe)
 Command 'mmd' from package 'mtools' (main)
 Command 'cm' from package 'config-manager' (universe)
 Command 'mcd' from package 'mtools' (main)
 Command 'icmd' from package 'renameutils' (universe)
cmd: command not found
//stdout.txt中无内容
root@sparkmaster:~/ShellLearning/chapter10# cat stdout.txt 
//ls命令合法,会产生标准输出,此时会被重定向到stdout.txt文件当中
root@sparkmaster:~/ShellLearning/chapter10# ls 2>stderr.txt 1>stdout.txt 
root@sparkmaster:~/ShellLearning/chapter10# cat stdout.txt 
shell2.txt
shellError.txt
shell.txt
stderr.txt
stdout.txt

在实际使用时,有些时候可能会将标准输出与标准错误输出都重定向到一个文件,此时可以使用下列命令

//&>将标准错误输出转换为标准输出,相当于2>&1
root@sparkmaster:~/ShellLearning/chapter10# cmd &> output.txt
root@sparkmaster:~/ShellLearning/chapter10# cat output.txt 
No command 'cmd' found, did you mean:
 Command 'dcmd' from package 'devscripts' (main)
 Command 'wmd' from package 'wml' (universe)
 Command 'tcmd' from package 'tcm' (universe)
 Command 'cmp' from package 'diffutils' (main)
 Command 'qcmd' from package 'renameutils' (universe)
 Command 'mmd' from package 'mtools' (main)
 Command 'cm' from package 'config-manager' (universe)
 Command 'mcd' from package 'mtools' (main)
 Command 'icmd' from package 'renameutils' (universe)
cmd: command not found
root@sparkmaster:~/ShellLearning/chapter10# ls &>output.txt 
root@sparkmaster:~/ShellLearning/chapter10# cat output.txt 
output.txt
shell2.txt
shellError.txt
shell.txt
stderr.txt
stdout.txt

有时命令运行时,对于出错信息我们并不关心,又不想浪费存储空间存储这些错误信息,此时可以将其丢弃,具体做法是将标准错误输出重定向到/dev/null文件当中,/dev/null就像一个垃圾黑洞

//将错误信息丢弃
root@sparkmaster:~/ShellLearning/chapter10# cmd 2> /dev/null

标准错误输出或标准输出还可以作为管道命令的标准输入,例如:

//标准输出作为另外一个命令的标准输入
root@sparkmaster:~/ShellLearning/chapter10# cat stdout.txt | more
shell2.txt
shellError.txt
shell.txt
stderr.txt
stdout.txt
//标准错误输出作为另一个命令的标准输入
root@sparkmaster:~/ShellLearning/chapter10# ls + | more
ls: cannot access +: No such file or directory

有时我们既想将标准错误输出或标准输出重定向到一个文件当中,又想它作为另外一个命令的标准输入,这时可以使用tee命令

//标准输出重定向到文件teeStdout.txt当中,同时又作为more的标准输入
root@sparkmaster:~/ShellLearning/chapter10# ls  | tee teeStdout.txt | more
output.txt
shell2.txt
shellError.txt
shell.txt
stderr.txt
stdout.txt
teeStdout.txt
root@sparkmaster:~/ShellLearning/chapter10# cat teeStdout.txt 
output.txt
shell2.txt
shellError.txt
shell.txt
stderr.txt
stdout.txt
teeStdout.txt
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
3月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何开发ODPS Spark任务
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
3月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
43 6
|
3月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
49 5
|
3月前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
55 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
|
3月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
109 3
|
2月前
|
SQL 分布式计算 大数据
代码编码原则和规范大数据开发
此文档详细规定了SQL代码的编写规范,包括代码的清晰度,执行效率,以及注释的必要性。它强调所有SQL关键字需统一使用大写或小写,并禁止使用select *操作。此外,还规定了代码头部的信息模板,字段排列方式,INSERT, SELECT子句的格式,运算符的使用,CASE语句编写规则,查询嵌套规范,表别名定义,以及SQL注释的添加方法。这些规则有助于提升代码的可读性和可维护性。
45 0
|
2月前
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
82 0
|
3月前
|
数据可视化
Echarts数据可视化开发| 智慧数据平台
Echarts数据可视化开发| 智慧数据平台