本文是我学习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的地方,后面一定更控制条件