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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*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
AI 代码解读

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

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

root@sparkmaster:~/ShellLearning/chapter09# echo $result
3
AI 代码解读

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
AI 代码解读

[]命令的功能与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

AI 代码解读

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

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

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

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")

AI 代码解读

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

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

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
AI 代码解读

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

//stderr
root@sparkmaster:~/ShellLearning/chapter10# cat ls
cat: ls: No such file or directory
AI 代码解读

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

//利用>命令将标准输出重定向输出到文件,>命令首先清空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
AI 代码解读

刚提到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
AI 代码解读

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

//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
AI 代码解读

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

//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
AI 代码解读

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

//&>将标准错误输出转换为标准输出,相当于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
AI 代码解读

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

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

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

//标准输出作为另外一个命令的标准输入
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
AI 代码解读

有时我们既想将标准错误输出或标准输出重定向到一个文件当中,又想它作为另外一个命令的标准输入,这时可以使用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
AI 代码解读
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
2月前
|
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
125 32
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
59 17
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
64 26
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
172 13
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
184 0
Linux 如何更改默认 Shell
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
141 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
143 79
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
350 2
ClickHouse与大数据生态集成:Spark & Flink 实战
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等