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