默认条件下,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
[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
==:等于(字符串比较也可以使用一个=,表示等于) !=:不等于 > :大于 < :小于 >=:大于等于 <=:小于等于
[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