前言
- 大数据 基础概念
- 大数据 Centos基础
- 大数据 Shell基础
- 大数据 ZooKeeper
- 大数据 Hadoop介绍、配置与使用
- 大数据 Hadoop之HDFS
- 大数据 MapReduce
- 大数据 Hive
- 大数据 Yarn
- 大数据 MapReduce使用
- 大数据 Hadoop高可用HA
介绍
Linux的命令行接口归结起来就是各种Shell,那么到底什么是Shell?
Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive)。
Shell,译为外壳,是用户直接连入计算机所使用的计算机程序,负责解析用户提供的命令,如词法分析、语法分析、句法分析。
完整教程
Shell执行方式
./test.sh
sh test.sh
source test.sh
方式1和方式2其实是一样的,都是在当前父进程下的子进程中执行,子进程执行结束之后,子进程中的变量和操作将会结束而且不会传回到父进程中。
换句话说,方式1和方式2是作用于子进程本身,方式3则作用于整个父进程。
Shell变量
查看系统变量可以使用set
命令查看。
变量的声明采用的是变量名=值
的方式定义,而且等号的左右不能有空格,否则报错
,变量名称一般习惯采用大写。
在定义变量的时候,双引号是允许格式化字符串,比如Hello World!$USERNAME
输出结果为Hello World!Linux
。而单引号禁止格式化字符串,即Hello World!$USERNAME
输出结果为Hello World!$USERNAME
。
- 双引号的优点:
- 双引号里可以出现转义字符
- 双引号里可以有变量
- 单引号的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
系统变量可以使用unset 变量名
撤销。
如果想要把一个变量升级为全局环境变量,可以采用export
关键字来提升。
如果希望变量只读,可以使用readonly
关键字声明,比如readonly 变量名
。
特殊变量替换
变量替换 | 说明 |
---|---|
${var:-value} |
如果变量var 的值未被设置或者为null ,使用value 作为变量var 的值进行替换。否则,使用var 的值进行替换。在替换的过程中,变量var 的值不变。 |
${var:=value} |
如果变量var 的值未被设置或者为null ,则将value 赋给变量var ,并进行替换。 |
${var:+value} |
如果变量var 的值未被设置或者为null ,则使用null 进行替换。否则,使用value 进行替换。在替换的过程中,变量var 的值不变。 |
${var:?value} |
如果变量var 的值已经设置,则使用var 的值替换。如果变量var 的值未被设置或者为null ,则使用value 作为错误提示信息。如果省略了value ,则输出默认的错误提示信息,表示var 未被设置,然后终止脚本执行。在替换过程中,var 的值不变。 |
Shell运算符
获取执行结果
what=`ls -al`
- 执行
ls -al
并将执行结果赋值给变量what
。
- 执行
what=$(ls -al)
- 同上,注意:
$()
是赋值操作。
- 同上,注意:
expr
,可以使用expr
表达式计算表达式的结果。- 注意:
expr
表达式后面的运算符和变量都需要用空格分隔。 - 例如计算
【仅仅支持整数运算】
a=`expr 3 + 4` * 12
- 等价于
a=$(((3+4)*12))
- 注意:
$(())
用于表达式结果计算,必须是双重小括号。
- 注意:
参数传递
参数处理 | 参数处理说明 |
---|---|
$# |
传递到脚本的参数个数。 |
$* |
以一个单字符串显示所有向脚本传递的参数。如"$* “用「”」括起来的情况、以"$1 $2 … $n "的形式输出所有参数。 |
$$ |
脚本运行的当前进程ID号。 |
$! |
后台运行的最后一个进程的ID号。 |
$@ |
与$* 相同,但是使用时加引号,并在引号中返回每个参数。如"$@ “用「”」括起来的情况、以"$1 " “$2 ” … "$n "的形式输出所有参数。 |
$- |
显示Shell使用的当前选项,与set 命令功能相同。 |
$? |
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
流程控制
shell for
# !/bin/bash
# 多层循环
for N in 1 2 3
do
echo $N
done
# 单行显示
for N in 1 2 3; do echo $N; done
# 当行显示
for N in {1..3};do echo $N; done
for ((i=0;i<=5;i++))
do
echo $i
done
for ((i=0;i<=5;i++));do echo $i;done;
while循环
i=1
while ((i<=3))
do
echo $i
let i++
done
unset i
case
case $1 in
start)
echo "starting"
;;
stop)
echo "ending"
;;
*)
echo "Usage:{start|stop}"
esac
Shell 关系运算符
字符串比较
注意:Linux中,true是
0
,false是1
……
说明:执行了举例
中的代码后,需要执行echo $?
来输出结果。
运算符 | 说明 | 举例 |
---|---|---|
= | 字符串比较 | [ 0 = 0 ] 输出结果为0 。 |
-lt | 小于 | [ 4 -lt 5 ] 输出结果为0 。 |
-le | 小于等于 | [ 4 -le 4 ] 输出结果为0 。 |
-eq | 等于 | [ 4 -eq 4 ] 输出结果为0 。 |
-gt | 大于 | [ 4 -gt 5 ] 输出结果为1 。 |
-ge | 大于等于 | [ 4 -ge 5 ] 输出结果为1 。 |
-ne | 不等于 | [ 4 -ne 5 ] 输出结果为0 。 |
注意:表达式需要用中括号包裹起来,而且中间必须使用空格分隔,否则报错
。
文件操作
说明:执行了
举例
中的代码后,需要执行echo $?
来输出结果。
运算符 | 说明 | 举例 |
---|---|---|
-r | 是否有读的权限。 | [ -r "test1.sh" ] |
-w | 是否有写的权限。 | [ -w "test1.sh" ] |
-x | 是否有执行的权限。 | [ -x "test1.sh" ] |
-f | 文件是否存在bin是一个常规的文件。 | [ -f "test1.sh" ] |
-s | 文件是否存在且不为空。 | [ -s "/opt" ] |
-d | 文件是否存在且是一个块设备。 | [ -b "/dev/block/7:0" ] |
-L | 文件是否存在且是一个链接。 | [ -L "/usr/bin/java" ] |
Shell函数
注意事项如下
- 必须在调用函数地方之前,先声明函数,
shell
脚本是逐行运行。【解释型】 - 函数返回值,只能通过
$?
系统变量获得,可以显示加:return
返回;如果不加,将以最后一条命令运行结果,作为返回值。return
后跟数值 。
# !/bin/bash
add() {
temp=$(($1+$2))
return temp
}
add 11 22
a=$?
echo --------------
echo "11 + 22 = $a"
输出结果是:
--------------
11 + 22 = 33
Shell调试
shell的调试可以在sh 命令后指定参数-vx
,比如sh -vx test1.sh
。