SHELL脚本-算数运算+条件判断

SHELL脚本-算数运算+条件判断

算数运算

整数运算

默认条件下,shell仅支持整数的 + - * / %(取模,求余)

通过$(( ))
[root@server1 ~]# echo $((1+1))
2
[root@server1 ~]# echo $((5/2))
2
[root@server1 ~]# echo $((5%2))
1

通过$[ ]
[root@server1 ~]# echo $[2*3]
6

通过expr命令
[root@server1 ~]# expr 1+2 #运算符前后都需要有空格
1+2
[root@server1 ~]# expr 1 + 2
3
[root@server1 ~]# expr 1 / 2
0
[root@server1 ~]# expr 1 * 2 # *是通配符,需要转义
expr: 语法错误
[root@server1 ~]# expr 1 \* 2
2

通过let命令(常用)
[root@server1 ~]# n=1
[root@server1 ~]# let n+=1
[root@server1 ~]# echo $n
2
[root@server1 ~]# let n-=1
[root@server1 ~]# echo $n
1
[root@server1 ~]# let n*=5
[root@server1 ~]# echo $n
5
[root@server1 ~]# let n=n**3 #计算幂方
[root@server1 ~]# echo $n
125

[root@server1 ~]# i=1;j=1
[root@server1 ~]# let i++
[root@server1 ~]# let ++j
[root@server1 ~]# echo $i
2
[root@server1 ~]# echo $j
2
[root@server1 ~]# let x=i++ #i++先赋值,后运算
[root@server1 ~]# let y=++j #++i先运算,后赋值
[root@server1 ~]# echo $x
2
[root@server1 ~]# echo $y
3

扩展:bc小数运算

[root@server1 ~]# yum install -y bc

非交互式
[root@server1 ~]# echo 2*1.4|bc
2.8

交互式
[root@server1 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
3+3.1
6.1
2/0.5
4
10/3
3
^C
(interrupt) Exiting bc.

条件判断

语法格式

test 条件表达式
test ! 条件表达式 #取反

[ 条件表达式 ]   #表达式前后都有空格
[ ! 条件表达式 ] #取反

[[ 条件表达式 ]]   #额外支持正则匹配
[[ ! 条件表达式 ]] #取反

数值比较

-eq	:相等
-ne	:不等
-gt	:大于
-lt	:小于
-ge :大于等于
-le	:小于等于

[root@server1 tmp]# [ 1 -eq 2 ];echo $?
1
[root@server1 tmp]# [ 1 -ne 2 ];echo $?
0
[root@server1 tmp]# [ 1 -gt 2 ];echo $?
1
[root@server1 tmp]# [ 1 -lt 2 ];echo $?
0
[root@server1 tmp]# [ 1 -ge 2 ];echo $?
1
[root@server1 tmp]# [ 1 -le 2 ];echo $?
0

字符串判断

长度判断

-z :是否为空字符串(长度为0)  
-n :是否为非空字符串

[root@server1 tmp]# [ -z 'hello world' ];echo $?
1
[root@server1 tmp]# [ -n 'hello world' ];echo $?
0
[root@server1 tmp]# [ -z ' ' ];echo $? #含有空格,非空
1
[root@server1 tmp]# [ -z '' ];echo $?
0
[root@server1 tmp]# A=hello
[root@server1 tmp]# [ -n "$A" ];echo $?
0
[root@server1 tmp]# [ -z "$A" ];echo $?
1

双目比较

== :是否等于
!= :是否不等于

[root@server1 tmp]# [hello == world ];echo $?
-bash: [hello: 未找到命令
127

报错:-bash: [hello: 未找到命令

原因:条件表达式前面没有空格

解决:[ hello == world ]

[root@server1 tmp]# [ hello == world ];echo $?
1
[root@server1 tmp]# [ hello != world ];echo $?
0
[root@server1 tmp]# [ 'hello world' != 'world hello' ];echo $?
0
[root@server1 tmp]# A=hello
[root@server1 tmp]# B=nihao
[root@server1 tmp]# [ "$B" == "$A" ];echo $?
1

文件判断

存在性判断

-e :exists   文件存在性测试,存在为真,否则为假
-b :block    存在且为块设备文件
-c :character存在且为字符设备文件
-d :directory存在且为目录文件
-f :file     存在且为普通文件
-h :hard     存在且为硬链接文件
-L :link     存在且为软链接文件 
-p :pipe     存在且为命名管道文件
-S :socket   存在且为套接文件
-s :size     存在且非空 

[root@server1 tmp]# touch file1
[root@server1 tmp]# test -a file1;echo $?
0
[root@server1 tmp]# test -a file2;echo $?
1
[root@server1 tmp]# [ -f file1 ];echo $?
0
[root@server1 tmp]# mkdir dir1
[root@server1 tmp]# [[ -d dir1 ]];echo $?
0
[root@server1 tmp]# test -s file1;echo $?
0
[root@server1 tmp]# test -s file2;echo $?
1
[root@server1 tmp]# test ! -s file2;echo $?
0

权限判断

-r :存在且可读 
-w :存在且可写 
-x :存在可执行
-g :存在且拥有sgid权限; 
-u :存在且拥有suid权限; 
-k :存在且拥有sticky权限;

[root@server1 tmp]# test -r file1;echo $?
0
[root@server1 tmp]# test -w file1;echo $?
0
[root@server1 tmp]# test -u file1;echo $?
1
[root@server1 tmp]# ll file1
-rw-r--r-- 1 root root 6 8月  21 16:40 file1

双目比较

file1 -nt  file2 :比较file1是否比file2新	
file1 -ot  file2 :比较file1是否比file2旧
file1 -ef  file2 :比较是否为同一个文件(是否指向同一个inode)

[root@server1 tmp]# [ file1 -ef file2];echo $?
-bash: [: 缺少 `]'
2

报错:-bash: [: 缺少 `]’

原因:条件表达式后面缺少空格

解决:[ file1 -ef file2 ]

[root@server1 tmp]# [ file1 -ef file2 ];echo $?
1
[root@server1 tmp]# test file1 -ef file2;echo $?
1

组合条件判断

-a :逻辑与
&& :逻辑与,前面表达式为真时,才会执行后面的内容

-o :逻辑或
|| :逻辑或,前面表达式为假时,才会执行后面的内容

!  :逻辑非

第一种方式: 
command1 && command2
command1 || command2 
! command 
第二种方式: 
expression1 -a expression2
expression1 -o expression2 
! expression

[root@server1 tmp]# [ 1 -eq 1 -a 1 -ne 1 ];echo $?
1
[root@server1 tmp]# [ 1 -eq 1 ] && [ 1 -ne 1 ];echo $?
1
[root@server1 tmp]# [ 1 -eq 1 -o 1 -ne 1 ];echo $?
0
[root@server1 tmp]# [ 1 -eq 1 ] || [ 1 -ne 1 ];echo $?
0

[root@server1 tmp]# [ 1 -eq 1 ] && echo ture
ture
[root@server1 tmp]# [ 1 -ne 1 ] && echo ture
[root@server1 tmp]# [ 1 -eq 1 ] || echo ture
[root@server1 tmp]# [ 1 -ne 1 ] || echo ture
ture

[root@server1 tmp]# [ 1 -eq 2 ] && echo true || echo false
false
[root@server1 tmp]# [ 1 -ne 2 ] && echo true || echo false
true

[root@server1 tmp]# [ $(id -u) -eq 0 ] && echo root || echo anybody  
root

[root@server1 tmp]# [ ! -d /dir1 ] && mkdir /dir1
[root@server1 tmp]# ls
dir1

类c风格比较

运算符

==:等于(字符串比较也可以使用一个=,表示等于) 
!=:不等于
> :大于 
< :小于
>=:大于等于
<=:小于等于

数值比较

[root@server1 tmp]# ((1==2)) && echo true || echo false
false
[root@server1 tmp]# ((1<=2)) && echo true || echo false
true
[root@server1 tmp]# ((1!=2)) && echo true || echo false
true
[root@server1 tmp]# ((`id -u`==0)) && echo true || echo false
true

字符串比较

[root@server1 tmp]# A=true;B=false
[root@server1 tmp]# [ "$A" = "$B" ];echo $?
1
[root@server1 tmp]# [ "$A" == "$B" ];echo $?
1
[root@server1 tmp]# [ "$A" != "$B" ];echo $?
0
上一篇:hadoop安装


下一篇:SQLZOO答案-Music Tutorial