本文是我学习Hadoop搭建过程中的各种笔记,内容来自于各种公开的教程,起点非常低,从Linux基础开始,直至在PC上搭建Hadoop成功,是真正的从零开始。
感谢过程中帮助我的各位认识的和不认识的老师。
23、shell中的运算符:
shell和其他编程语言一样,支持多种运算符,包括:
数学运算符(加,减,乘,除,模)、
关系运算符(大,小,比较)、
布尔运算符(是,非,and)
字符串运算符(判断字符串是否为空,是否相等)
文件运算符(文件是否有读写权限,文件是否存在)
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr(最常用)
expr是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两数相加(注意使用反引号`,而不是单引号 ’)
#!/bin/bash
val=`expr 3+3`
echo”两数之和为:$val”
执行脚本,输出结果如下所示:
两数之和为:6
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2 ,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 ` ` 包含 注意这个字符不是常用的单引号,在Esc建下边
算数运算符
下表列出了常用的算术运算符,假定变量a为10,变量b为20:
运算符 |
说明 |
举例 |
+ |
加法 |
`eapr $a + $b` 结果为 30 |
- |
减法 |
`eapr $a - $b` 结果为 10 |
* |
乘法 |
`eapr $a \* $b` 结果为 200 |
/ |
除法 |
`eapr $a / $b` 结果为 2 |
% |
取余 |
`eapr $a % $b` 结果为 0 |
= |
赋值 |
a=$b` 把变量b的值赋给a |
操作:
[root@hadoop01 ~]# vi ./al.sh
#!/bin/bash (注意:bash后面不可以有/)
a=20
b=10
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b` (*不能直接用乘号,要加一个反斜杠\)
echo `expr $a / $b`
echo `expr $a % $b` (取模)
[root@hadoop01 ~]# chmod 744 ./al.sh
[root@hadoop01 ~]# al.sh
30
10
200
2
0
1、 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表为常用的关系运算符,假定变量a为10,变量b为20:
运算符 |
说明 |
举例 |
-eq |
检测两个数是否相等,相等返回true |
[$a –eq $b]返回false |
-ne |
检测两个数是否相等,不相等返回false |
[$a –ne $b]返回true |
-gt |
检测左边的数是否大于右边的,如果是,返回true |
[$a –gt $b]返回false |
-lt |
检测左边的数是否小于右边的,如果是,返回true |
[$a –lt $b]返回true |
-ge |
检测左边的数是否大于等于右边的,如果是,返回true |
[$a –ge $b]返回false |
-le |
检测左边的数是否小于等于右边的,如果是,返回true |
[$a –le $b]返回ture |
关系运算符实例:
[root@hadoop01 ~]# vi ./al.sh
#!/bin/bash
a=10
b=20
if [ $a -eq $b ] 注意一点加空格!
then
echo “$a == $b”
fi fi结束
if [ $a -gt $b ]
then
echo “$a > $b”
fi
if [ $a -ge $b ]
then
echo “$a >= $b”
fi
if [ $a -le $b ]
then
echo “$a <= $b”
fi 【不会被打印出来】
if [ $a –ne $b ]
then
echo “$a != $b”
fi
清除脚本,按住d
2、 布尔运算符
下表列出了常用的布尔运算符,假定变量a为10,变量b为20:
运算符 |
说明 |
举例 |
! 非运算 |
表达式为true,则返回false,否则返回true |
[! false] 返回true |
-o 或运算 |
有一个表达式为true,则返回true |
[ $a –lt 20 –o $b –gt 100]返回true |
-a 与运算 |
两个表达式为true,才返回true |
[ $a –lt 20 –a $b –gt 100]返回false |
4、逻辑运算符
下表列出了常用的逻辑运算符,假定变量a为10,变量b为20:
运算符 |
说明 |
举例 |
|&& |
逻辑的 AND |
[[ $a –lt 100 && $b –gt100 ]] 返回false |
| | |
逻辑的 OR |
[[ $a –lt 100 | | $b –gt100 ]] 返回true |
5、字符串运算符
下表列出常用的字符串运算符,假定变量a为“abc”,b为变量“efg”
运算符 |
说明 |
举例 |
= |
检测两个字符串是否相等,相等返回true |
[ $a = $b ] 返回false |
!= |
检测两个字符串是否相等,不相等返回true |
[ $a != $b ] 返回 true |
-z |
检测字符串长度是否为0,为0返回true |
[ -z $a] 返回 false |
-n |
检测字符串长度是否为0,不为0返回true |
[ -n $a ] 返回 true |
-str |
检测字符串是否为空,不为空返回true |
[ $a ] 返回 ture |
[root@hadoop01 ~]# vi ./al.sh
#!/bin/bash
a=’this’
b=’this’
if [ $a = $b ]
then
echo “$a == $b”
fi
if [ $a != $b ]
then
echo “$a != $b”
fi
if [ -z $a ]
then
echo “$a is 0”
fi
if [ -n $a ]
then
echo “$a is not 0”
fi
if [ $a ]
then
echo “$a is not null”
fi
[root@hadoop01 ~]# al.sh
’this’ == ’this’
’this’ is not 0
’this’ is not null
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性
操作符 |
说明 |
举例 |
-b file |
检测文件是否是块设备文件,如果是,返回true |
[ -b $file ] 返回 false |
-c file |
检测文件是否是字符设备文件,如果是,返回true |
[ -c $file ] 返回 false |
-d file |
检测文件是否是目录,如果是,返回true |
[ -d $file ] 返回 false |
-f file |
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,返回true |
[ -f $file ] |
-g file |
检测文件是否设置了SGID,如果是,返回true |
[ -g $file ] 返回 false |
-k file |
检测文件是否是设置了粘着位(Sticky Bit),如果是,返回true |
[ -k $file ] 返回 false |
-p file |
检测文件是否是具名管道,如果是,返回true |
[ -p $file ] 返回 false |
-u file |
检测文件是否设置了SGID位,如果是,返回true |
[ -u $file ] 返回 false |
-r file |
检测文件是否可读,如果是,返回true |
[ -r $file ] 返回 false |
-w file |
检测文件是否可写,如果是,返回true |
[ -w $file ] 返回 false |
-x file |
检测文件是否可执行,如果是,返回true |
[ -x $file ] 返回 false |
-s file |
检测文件是否为空(文件大小是否大于0),如果是,返回true |
[ -s $file ] 返回 false |
-e file |
检测文件(包含目录)是否存在,如果是,返回true |
[ -e $file ] 返回 false |
实例:
变量file表示文件“/home/shell/first.sh”,它的大小为100字节,具有rwx权限,下面代码将检测该文件的各种属性:
[root@hadoop01 shell]#vi if.sh
#!/bin/bash
file= "/home/shell/first.sh"
if [ -r $file ]
then
echo "可读"
if
if [ -x $file ]
then
echo "可执行"
if
if [ -f $file ]
then
echo "is file"
if
if [ -d $file ]
then
echo "is directory"
if
if [ -s $file ]
then
echo "file is not null"
if
if [ -e $file ]
then
echo "file is exists"
if
#!/bin/bash
file=”/home/shell/first.sh”
if [ -r $file ]
then
echo”文件可读”
else
echo”文件不可读”
fi
24、shell中的if else:
shell脚本中的流程控制
写成一行这么写:if[ ]; then echo“”;fi
单一的if:(表达式必须有空格)
if[]
then
cmd1
fi
单一的if else :(表达式必须有空格,else后不能有then)
if[]
then
cmd1
else
cmd2
fi
if else-if else :(elif后必须有then)
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
案例:
[root@hadoop01 shell]#vi if.sh
#!/bin/bash
a=10
b=20
c=15
if [ $a -gt $b ]
then
echo "$a > $b"
fi
if [ $a -lt $b ]
then
echo "$a < $b"
else
echo "$a is not sammer $b"
fi
if [ $a -lt $b ]
then
echo "$a < $b"
elif [ $a -gt $b -a $b -lt $c ]
then
echo "$a > $b and $b < $c"
else
echo "$a < $b"
fi
[root@hadoop01 shell]# chmod 744 ./if.sh
[root@hadoop01 shell]# if.sh
10 < 20
10 < 20
不要写大于小于的符号,
大于:-gt,小于:-lt。
if 后面一点要有then,无论if还是elif
有if的地方,后面一定更控制条件