大数据技术之Shell
1. shell概述
示意图:
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
● Linux提供的Shell解析器有:
查看代码
[atguigu@hadoop101 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
● bash和sh的关系
查看代码
[atguigu@hadoop101 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5月 11 2016 bash
lrwxrwxrwx. 1 root root 4 5月 27 2017 sh -> bash
● Centos默认的解析器是bash
查看代码
[atguigu@hadoop102 bin]$ echo $SHELL
/bin/bash
2. Shell脚本入门
2.1 脚本格式
#!/bin/bash 以此开头(指定解析器)
2.2 第一个Shell脚本:helloworld
● 【案例】:
[atguigu@hadoop101 datas]$ touch helloworld.sh
[atguigu@hadoop101 datas]$ vi helloworld.sh
在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"
脚本的常用执行方式
方式一:bash/sh + 相对/绝对路径 (不用赋予脚本 +x 权限)
sh + | 相对 |
Helloworld |
||
绝对 | bash + | 相对 | 绝对 | |
相对 | 绝对 | [atguigu@hadoop101 datas]$ /home/atguigu/datas/helloworld.sh |
注意:
方式一:本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
方式二:本质是脚本自己执行,所以需要执行权限。
3. 变量
3.1 系统预定义变量
● 常用系统变量
$HOME、$PWD、$SHELL、$USER、$PATH等
● 【案例】
查看系统变量的值:echo $HOME
显示当前Shell中所有变量:set
3.2 自定义变量
基本语法
● 定义变量:变量=值
● 撤销变量:unset 变量
● 声明静态变量:readonly 变量 (注意:不能unset)
变量定义规则
● 变量名称起名同java的一样
● “=”两侧无空格
● 默认为字符串类型。
● 变量值有空格,使用双引号或单引号。
【案例】
(1)定义变量A
查看代码
[atguigu@hadoop101 datas]$ A=5
[atguigu@hadoop101 datas]$ echo $A
5
(2)给变量A重新赋值
查看代码
[atguigu@hadoop101 datas]$ A=8
[atguigu@hadoop101 datas]$ echo $A
8
(3)撤销变量A
查看代码
[atguigu@hadoop101 datas]$ unset A
[atguigu@hadoop101 datas]$ echo $A
(4)声明静态的变量B=2,不能unset
查看代码
[atguigu@hadoop101 datas]$ readonly B=2
[atguigu@hadoop101 datas]$ echo $B
2
[atguigu@hadoop101 datas]$ B=9
-bash: B: readonly variable
(5)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
查看代码
[atguigu@hadoop102 ~]$ C=1+2
[atguigu@hadoop102 ~]$ echo $C
1+2
(6)变量的值如果有空格,需要使用双引号或单引号括起来
查看代码
[atguigu@hadoop102 ~]$ D=I love banzhang
-bash: world: command not found
[atguigu@hadoop102 ~]$ D="I love banzhang"
[atguigu@hadoop102 ~]$ echo $D
I love banzhang
3.3 特殊变量
3.3.1 $n
基本语法: $n
功能:n为数字
● $0 脚本名称,
● $1-$9 第一到第九个参数,
● n>10 需使用大括号,如${10}
【案例】
[root@1025 datas]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[root@1025 datas]# vim paramter.sh
[root@1025 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2
3.3.2 $#
基本语法:$#
功能:获取所有输入参数个数,常用于循环
【案例】
[root@1025 datas]# vim paramter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[root@1025 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2
3
3.3.3 $*、$@
基本语法
一个整体。
区别对待。
【案例】
[root@1025 datas]# vim paramter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[root@1025 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2
3
1 2 3
1 2 3
3.3.4 $?
基本语法
$?
功能:最后一次执行的命令的返回状态。 上一个命令,执行正确,返回0 执行错误,返回非0
【案例】判断hello.sh脚本是否正确执行
[root@1025 datas]# bash hello.sh
hello world!
[root@1025 datas]# echo $?
0
4. 运算符
基本语法
“ $[运算式] ”
【案例】计算(2+3)*4 的值
[root@1025 datas]# sum=$(((2+3)*4))
[root@1025 datas]# echo sum
sum
[root@1025 datas]# echo $sum
20
[root@1025 datas]# sum=$[(2+3)*4]
[root@1025 datas]# echo $sum
20
5. 条件判断
基本语法
(1) test condition
(2) [ condition ] (注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
常用判断条件
● 两个整数之间比较
小于(less than) | -le | 小于等于(less equal) | |
大于(greater than) | -ge | 大于等于(greater equal) | |
-eq | 等于(equal) | -ne | 不等于(Not equal) |
= | 字符串比较 |
● 按照文件权限进行判断
-r | 读的权限(read) |
-w | 写的权限(write) |
-x | 执行的权限(execute) |
● 按照文件类型进行判断
-f | 文件存在 且为 常规文件(file) |
-e | 文件存在(existence) |
-d | 存在 且为 目录(directory) |
【案例】
(1) 23是否大于等于22
[root@1025 datas]# [ 23 -ge 22 ]
[root@1025 datas]# echo $?
0
(2) helloworld.sh是否具有写权限
[root@1025 datas]# ll
总用量 8
-rw-r--r--. 1 root root 32 12月 8 07:32 hello.sh
-rw-r--r--. 1 root root 52 12月 8 07:27 paramter.sh
[root@1025 datas]# [ -w hello.sh ]
[root@1025 datas]# echo $?
0
(3) /opt/datas目录中的文件是否存在
[root@1025 opt]# [ -e /opt/datas ]
[root@1025 opt]# echo $?
0
(4) 多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[root@1025 datas]# [ condition ] && echo true || echo false
6. 流程控制(重点)
6.1 if判断
基本语法
if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi |
注意:
● [ 条件判断式 ],中括号和条件判断式之间必须有空格。
● if 后要有空格。
【案例】
输入一个数字,如果是1,则输出“我是伢子”,如果是2,则输出“我是阿獠”,如果是3,则输出“我是阿香”,如果是其它,什么也不输出。
[root@1025 datas]# vim if.sh
[root@1025 datas]# bash if.sh 3
我是阿香
[root@1025 datas]# bash if.sh 1
我是伢子
[root@1025 datas]# bash if.sh 2
我是阿獠
#!/bin/bash
if [ $1 -eq "1" ]
then
echo "我是伢子"
elif [ $1 -eq "2" ]
then
echo "我是阿獠"
elif [ $1 -eq "3" ]
then
echo "我是阿香"
fi
6.2 case语句
基本语法
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac |
注意事项:
● case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
● 双分号“;;”表示命令序列结束,相当于java中的break。
● 最后的“*)”表示默认模式,相当于java中的default。
【案例】输入一个数字,如果是1,则输出“我是伢子”,如果是2,则输出“我是阿獠”,如果是3,则输出“我是阿香”,如果是其它,输出“哈哈哈~”
[root@1025 datas]# vim case.sh
[root@1025 datas]# bash case.sh 1
伢子
[root@1025 datas]# bash case.sh 2
阿獠
[root@1025 datas]# bash case.sh 3
阿香
[root@1025 datas]# bash case.sh 7
哈哈哈~
#!/bin/bash
case $1 in
"1")
echo "伢子"
;;
"2")
echo "阿獠"
;;
"3")
echo "阿香"
;;
*)
echo "哈哈哈~"
;;
esac
6.3 for循环
基本语法1
for (( 初始值;循环控制条件;变量变化 )) do 程序 done |
【案例】从1加到100
[root@1025 datas]# vim for1.sh
[root@1025 datas]# bash for1.sh
5050
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
基本语法2
for 变量 in 值1 值2 值3… do 程序 done |
【案例】
(1)打印所有输入参数
[root@1025 datas]# vim for2.sh
[root@1025 datas]# bash for2.sh xm xh xg
我是 xm
我是 xh
我是 xg
#!/bin/bash
for i in $*
do
echo "我是 $i "
done
(2)比较$*和$@区别
$*和$@都表示传递给函数或脚本的所有参数
【案例1】对$*、$@不使用 "",都以$1 $2 …$n的形式输出所有参数。
[root@1025 opt]# vim for.sh
[root@1025 opt]# bash for.sh xm xh xg
I am xm
I am xh
I am xg
---------------------
I am xg
I am xg
I am xg
for i in $*
do
echo "I am $i "
done
echo "---------------------"
for j in $@
do
echo "I am $j"
done
【案例2】对$*、$@使用 "","$*"以"$1 $2 …$n"的形式整体输出。 "$@"以"$1"、 "$2"、 …、"$n"的形式分开输出。
[root@1025 opt]# vim for.sh
[root@1025 opt]# bash for.sh xm xh xg
I am xm xh xg
---------------------
I am xm
I am xh
I am xg
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "I am $i"
done
echo "---------------------"
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "I am $j"
done
6.4 while循环
基本语法
while [ 条件判断式 ] do 程序 done |
【案例】
[root@1025 datas]# vim while.sh
[root@1025 datas]# bash while.sh
5050
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
7. read读取控制台输入
基本语法
read(选项)(参数) 选项: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 参数 变量:指定读取值的变量名 |
【案例】提示7秒内,读取控制台输入的名称
[root@1025 datas]# vim read.sh
[root@1025 datas]# bash read.sh
Enter your name in 7 seconds
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
8. 函数
8.1系统函数
8.1.1 basename
基本语法
basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。 选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。 |
【案例】截取该/opt/a.txt路径的文件名称
8.1.2 dirname
基本语法
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)) |
【案例】获取a.txt文件的路径
8.2 自定义函数
基本语法
[ function ] funname[()] { Action; [return int;] } funname |
注意:
● 先声明函数,再调用,
● shell脚本是逐行运行。不会像其它语言一样先编译。
● 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
【案例】
[root@1025 opt]# vim fun.sh
[root@1025 opt]# bash fun.sh
Please input the number1:2
Please input the number1:5
7
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
大数据技术之Shell的更多相关文章
- 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)
1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...
- 大数据技术之Hadoop3.1.2版本HA模式
大数据技术之Hadoop3.1.2版本HA模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Hadoop的HA特点 1>.主备NameNode 2>.解决单点故障 ...
- 大数据技术之Hadoop3.1.2版本完全分布式部署
大数据技术之Hadoop3.1.2版本完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinz ...
- 大数据技术之HBase
第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...
- 除Hadoop大数据技术外,还需了解的九大技术
除Hadoop外的9个大数据技术: 1.Apache Flink 2.Apache Samza 3.Google Cloud Data Flow 4.StreamSets 5.Tensor Flow ...
- 参加2013中国大数据技术大会(BDTC2013)
2013年12月5日-6日参加了为期两天的2013中国大数据技术大会(Big Data Technology Conference, BDTC2013),本期会议主题是:“应用驱动的架构与技术 ”.大 ...
- 大数据技术人年度盛事! BDTC 2016将于12月8-10日在京举行
2016年12月8日-10日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所和CSDN共同协办的2016中国大数据技术大会(Big Data Technology ...
- 大数据技术 vs 数据库一体机[转]
http://blog.sina.com.cn/s/blog_7ca5799101013dtb.html 目前,虽然大数据与数据库一体机都很火热,但相当一部分人却无法对深入了解这两者的本质区别.这里便 ...
- 超人学院Hadoop大数据技术资源分享
超人学院Hadoop大数据技术资源分享 http://bbs.superwu.cn/forum.php?mod=viewthread&tid=807&fromuid=645 很多其它精 ...
- 2016中国大数据技术大会( BDTC ) 共商大数据时代发展之计
中国大数据技术大会(BDTC)的前身是Hadoop中国云计算大会(HadoopinChina,HiC).从2008年仅60余人参加的技术沙龙发展到当下数千人的技术盛宴,目前已成为国内最具影响力.规模最 ...
随机推荐
- 2024-08-03:用go语言,给定一个从 0 开始的字符串数组 `words`, 我们定义一个名为 `isPrefixAndSuffix` 的布尔函数,该函数接受两个字符串参数 `str1` 和
2024-08-03:用go语言,给定一个从 0 开始的字符串数组 words, 我们定义一个名为 isPrefixAndSuffix 的布尔函数,该函数接受两个字符串参数 str1 和 str2. ...
- 人形机器人(humanoid)(双足机器人、四足机器人)—— 操控员 —— 机器人数据收集操作员
参考: https://www.youtube.com/watch?v=jbQ4M4SNb2M 机器人数据收集操控员,就和大模型训练数据收集员.数据类型标识员(打标签人员)一样,都是为了人工生成AI训 ...
- (续) gym atari游戏的环境设置问题:Breakout-v0, Breakout-v4, BreakoutNoFrameskip-v4和BreakoutDeterministic-v4的区别
根据前文(https://www.cnblogs.com/devilmaycry812839668/p/14665072.html)我们知道: 首先是v0和v4的区别:带有v0的env表示会有25%的 ...
- Debian/ubuntu系统的开机自启动服务的设置——update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
最近把自己的树莓派搞了起来,搭了个上网的共享热点,但是遇到了开机自启动的设置问题. 我们先给出正常的ubuntu系统的开机自启动服务的设置: 在 /etc/init.d/ 路径下面创建自启动的shel ...
- ELT已死,EtLT才是现代数据处理架构的终点!
提到数据处理,经常有人把它简称为"ETL".但仔细说来,数据处理经历了ETL.ELT.XX ETL(例如,Reverse ETL.Zero-ETL)到现在流行的EtLT架构几次更迭 ...
- 从论文到图谱,或许只差一个html
书接上回,在文章<论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样>中,我向大家讲述了如何用图的方式思考图计算系统的演进历史,并在后续的系列文中结合Awesome-G ...
- SenseCraft 部署模型到Grove Vision AI V2图像处理模块
Grove Vision AI V2 图像处理模块开箱测评 摘要 今天教大家快速上手 Grove Vision AI V2 图像处理模块,我们将一起探讨如何利用 SenseCraft 部署 AI 模型 ...
- Blazor开发框架Known-V2.0.9
V2.0.9 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行.本次版本主要是修复一些BUG和表格页面功能增强. 官网:http://known.puma ...
- Adobe Photoshop cc2022 Mac中文破解版下载 支持intel/M1/M2/M3
Adobe Photoshop cc2022 Mac版,支持intel.M1.M2.M3芯片,全系都能使用,最低系统需求:11.0以上.建议安装此版本或者ps2024版本. 下载地址放到最后,先来看安 ...
- 新一代监控神器Prometheus+Grafana介绍及使用
一.介绍 1.什么是Prometheus? 普罗米修斯是一个开源的系统监控及报警工具,在2016年加入了 Cloud Native Computing Foundation,是继Kubernetes之 ...