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

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 本节主要内容shell编程简介变量定义常用特殊变量1. shell编程简介学习linux操作系统最让人着迷的事情莫过于shell脚本编程,这是因为如果要完成某些复杂的功能,单纯地通过GUI操作不可能达到,shell脚本可以直接与操作系统内核打交道,从而完成任意复杂的任务。shell有很多种,最常用的是Bash (Bourne Again Shell),它是L

本节主要内容

  1. shell编程简介
  2. 变量定义
  3. 常用特殊变量

1. shell编程简介

学习linux操作系统最让人着迷的事情莫过于shell脚本编程,这是因为如果要完成某些复杂的功能,单纯地通过GUI操作不可能达到,shell脚本可以直接与操作系统内核打交道,从而完成任意复杂的任务。shell有很多种,最常用的是Bash (Bourne Again Shell),它是Linux操作系统默认的shell环境。

在linux环境中,需要区分一下root用户与一般用户的命令行显示:

//root用户与一般用户显示有一些差异
//root用户命令行以#结尾
root@sparkmaster:~# su zhouzhihu
//一般用户命令行以$符号结尾
zhouzhihu@sparkmaster:/root$ exit
exit
root@sparkmaster:~# 

如下图:
这里写图片描述

现在让我们来编写第一个shell程序吧

root@sparkmaster:~/ShellLearning/chapter09# vi HelloWorld.sh 

这里写图片描述
就两行内容:

#!/bin/bash
echo "Hello Shell"

那完成后如果执行shell脚本程序呢?有两种方式,一种是通过sh命令,另外一种是自执行方式。下面给出了具体演示

//完成后直接利用sh命令执行
root@sparkmaster:~/ShellLearning/chapter09# sh HelloWorld.sh 
Hello Shell
//自执行(self execute)方式,由于没有给文件加执行权限,所以执行失败
root@sparkmaster:~/ShellLearning/chapter09# ./HelloWorld.sh
bash: ./HelloWorld.sh: Permission denied
root@sparkmaster:~/ShellLearning/chapter09# ls -l
total 4
-rw-r--r-- 1 root root 31 2015-09-30 06:29 HelloWorld.sh
//chmod给文件加执行权限
root@sparkmaster:~/ShellLearning/chapter09# chmod a+x HelloWorld.sh 
//再通过自执行方式
root@sparkmaster:~/ShellLearning/chapter09# ./HelloWorld.sh
Hello Shell
root@sparkmaster:~/ShellLearning/chapter09# 

前面提到,脚本第一行是#!/bin/bash,它的作用是提示该脚本的执行路径是/bin/bash,对自执行方式有用,自执行方式最终是通过/bin/bash HelloWorld.sh 执行脚本,而利用sh HelloWorld.sh命令执行脚本时,#!/bin/bash 不起作用。

HelloWorld.sh文件中的echo “Hello Shell”是一条语句,一般习惯于一行一条语句,如:

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

如果要将上述语句放在一行,则需要用;隔开

echo "Hello Shell";echo "Hello World"

echo命令用于输出一行内容(包括行符),后面的输出内容除可以用”“双引号之外,也可以不加,也可以用单引号”例如:

root@sparkmaster:~/ShellLearning/chapter09# echo "Hello World"
Hello World
root@sparkmaster:~/ShellLearning/chapter09# echo Hello World
Hello World
root@sparkmaster:~/ShellLearning/chapter09# echo 'Hello World'
Hello World

这三种方式看上去似乎相同,但其实它们之间还是有差异的,具体如下:

//对于一些特殊字符,双引号可能不会正常输出
root@sparkmaster:~/ShellLearning/chapter09# echo "Hello World!"
bash: !": event not found

//不带引号的参数不会出现这种情况
root@sparkmaster:~/ShellLearning/chapter09# echo 'Hello World!'
Hello World!

//单引号也能正常输出
root@sparkmaster:~/ShellLearning/chapter09# echo Hello World!
Hello World!

//不带引号的参数使用如果带特殊字符,两条语句不能放在同一行
root@sparkmaster:~/ShellLearning/chapter09# echo Hello World!;echo Hello
bash: !: event not found

//不带引号,输出的是变量内容
root@sparkmaster:~/ShellLearning/chapter09# echo $JAVA_HOME
/hadoopLearning/jdk1.7.0_67
//双引号,输出的也是变量内容
root@sparkmaster:~/ShellLearning/chapter09# echo "$JAVA_HOME"
/hadoopLearning/jdk1.7.0_67
//单引号的话,内容原样输出,不会解析变量值
root@sparkmaster:~/ShellLearning/chapter09# echo '$JAVA_HOME'
$JAVA_HOME

2. 变量定义

前一小节提到$JAVA_HOME,这是配置的JAVA环境变量,这一小节我们将介绍如何进行变量定义,如何配置环境变量。同任何的编程语言一样,变量是用来存储可变数据的,即在程序运行过程中变量中的数据可能随时发生变化。shell脚本中的变量同其它脚本语言一样,在使用时不需要进行类型定义,不管是加引号还是不加引号定义变量,其类型都为String,例如:

//t1为String类型
root@sparkmaster:~/ShellLearning/chapter09# t1="123"
root@sparkmaster:~/ShellLearning/chapter09# $t1
123: command not found
root@sparkmaster:~/ShellLearning/chapter09# echo $t1
//t1为String类型
root@sparkmaster:~/ShellLearning/chapter09# t1=123
root@sparkmaster:~/ShellLearning/chapter09# echo $t1
123

上面的变量是我们自己定义的,它具有一定的局部性,例如:

root@sparkmaster:~/ShellLearning/chapter09# t1=123
//在当前进程中能够正常输出内容
root@sparkmaster:~/ShellLearning/chapter09# echo $t1
123
//开启一个子进程
root@sparkmaster:~/ShellLearning/chapter09# bash
//无内容输出
root@sparkmaster:~/ShellLearning/chapter09# echo $t1

//退出,返回原父进程
root@sparkmaster:~/ShellLearning/chapter09# exit
exit
//内容又能够正常输出
root@sparkmaster:~/ShellLearning/chapter09# echo $t1
123

从上面的代码可以看到,自定义变量具有只能在当前进程中使用,当开启子进程时,变量在子进程中不起作用,如果需要父进程中定义的变量在子进程中也能够使用,则需要将其设置为环境变量,环境变量使用export命令进行定义,代码如下:

//采用export命令将t1设置为环境变量
root@sparkmaster:~/ShellLearning/chapter09# export t1
root@sparkmaster:~/ShellLearning/chapter09# bash
//子进程中现在可能使用
root@sparkmaster:~/ShellLearning/chapter09# $t1
123: command not found
root@sparkmaster:~/ShellLearning/chapter09# echo $t1
123

不过,这样定义的环境变量,在命令行窗口关闭或系统重新启动时会丢失,如果需要在机器启动时环境变量就自动生效的话,可以将环境变量定义在~/.bashrc或/etc/profile文件中,其中~/.bashrc只对当前用户(例如当前用户是zhouzhihu,则只对本用户有效),如果想对所有用户都有效,则将其放置在/etc/profile文件中。
下图给出了java、scala语言等环境变量配置演示:
这里写图片描述

3. 常用特殊变量

在linux脚本编程中,有几个非常重要的特殊变量,说它特殊是因为它变量无需程序员自己定义,系统默认会帮我们进行初始化等相关操作,常用特殊变量如下:

$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9$$ 是脚本运行的当前进程ID$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

下面我们举例进行演示:

root@sparkmaster:~/ShellLearning/chapter09# vi SpecialVariable.sh

这里写图片描述
root@sparkmaster:~/ShellLearning/chapter09# ./SpecialVariable.sh 1 2 3 4
4
./SpecialVariable.sh
1
2
1 2 3 4
1 2 3 4
17138
0

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
1月前
|
存储 缓存 分布式计算
大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍
大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍
36 4
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
62 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
存储 缓存 分布式计算
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
42 4
|
1月前
|
分布式计算 Java 大数据
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
38 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
41 5
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
430 2
|
1月前
|
SQL 分布式计算 大数据
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
37 0