shell脚本中if用法

IF使用基础

单分支语句结构

if [ 条件表达式 ]; then
    指令
fi

双分支语句结构

if [ 条件表达式 ]; then
    指令一
else
    指令二
fi

多分支语句结构

if [ -f file ]; then
   echo "yes yes yes"
elif [ -z file ]; then
   echo "yes yes"
else
   echo "nonono"
fi

注意 if的结构为 if then else fi

从上面三个结构中可以看出,条件表达式的左右,以及[ ]的左右都要有空格。

条件表达式

文件表达式

文件属性
-a file如果file存在则为真
-b file如果file存在且为块文件则为真
c file如果file存在且为字符文件则为真
-d file如果file存在且是目录则为真
-e file如果file存在则为真
-f file如果file存在且为普通文件则为真
-g file如果file存在且置位设置-组ID则为真
-h file如果file存在且为符号连接则为真
-k file如果file存在且其粘性位置位则为真,参考man chmod
-p file如果file存在且为命令管道(FIFO)则为真
-r file如果file存在且可读则为真
-s file如果file存在且文件长度大于0则为真
-t fd如果文件描述符fd打开且指向为终端则为真
-u file如果file存在且设置-用户-ID置位则为真
-w file如果file存在且可写则为真
-x file如果file存在且可执行
-G file如果file存在且由有效组ID拥有则为真
-L file如果file存在且为符号连接则为真
-N file如果file存在且在上次读后有修改(modified)则为真
-O file如果file存在且由有效用户ID拥有则为真
-S file如果file存在且是一个套接字则为真
file1 -ef file2如果file1和file2指向同一个设备的inode则为真
file1 -nt file2如果file1比file新(modified),或者file1存在file2不存在在为真
file1 -ot file2如果file1比file旧(modified),或者file1存在file2不存在在为真

数字表达式

int1 -eq int2    两数相等为真 
int1 -ne int2    两数不等为真 
int1 -gt int2    int1大于int2为真 
int1 -ge int2    int1大于等于int2为真 
int1 -lt int2    int1小于int2为真 
int1 -le int2    int1小于等于int2为真

不要用=<>符号,如果要用的话

整数比较
 
-eq       等于,如:if [ "$a" -eq "$b" ]
-ne       不等于,如:if [ "$a" -ne "$b" ]
-gt       大于,如:if [ "$a" -gt "$b" ]
-ge       大于等于,如:if [ "$a" -ge "$b" ]
-lt       小于,如:if [ "$a" -lt "$b" ]
-le       小于等于,如:if [ "$a" -le "$b" ]
<       小于(需要双括号),如:(("$a" < "$b"))
<=       小于等于(需要双括号),如:(("$a" <= "$b"))
>       大于(需要双括号),如:(("$a" > "$b"))
>=       大于等于(需要双括号),如:(("$a" >= "$b"))

字符串表达式

字符串测试
-z string如果string长度为0则为真
-n string如果string长度不为0则为真
string1 == string2
string1 = string2如果string1和string2相等则为真,=只应由test使用
string1 != string2如果字符串不相等则为真
string1 < string2如果按字典序string1在string2之前则为真
string1 > string2如果按字典序string1在string2之后则为真
str1 = str2      当两个串有相同内容、长度时为真 
str1 != str2      当串str1和str2不等时为真 
-n str1        当串的长度大于0时为真(串非空) 
-z str1        当串的长度为0时为真(空串) 
str1         当串str1为非空时为真

&& ||使用

在[ ]中不能用&& ||

要用

-a         与 
-o        或 
!        非

if [ $score -ge 0 -a $score -lt 60 ];
then echo "sorry,you are lost!" 
elif [ $score -ge 60 -a $score -lt 85 ];
then echo "just soso!" 
elif [ $score -le 100 -a $score -ge 85 ];
then echo "good job!" 
else echo "input score is wrong , the range is [0-100]!" 
fi

如果一定要用&& ||则要到[[ ]]中使用。

test与[ ]

格式1:test <测试表达式>
格式2:[<条件表达式>]

格式1和格式2是等价的,test 一般在linux界面用,[ ]一般在if表达式用,如:

1、测试文件是否存在
[root@node01 ~]# test -f file&& echo 1||echo 0
0
[root@node01 ~]# touch file
[root@node01 ~]# test -f file&& echo 1||echo 0
1
 
[root@node01 ~]# test ! -f file&& echo 1||echo 0 取反
0
2、中括号
[root@node01 ~]# [ -f file ]&& echo 1||echo 0
1
[root@node01 ~]# rm file
[root@node01 ~]# [ -f file ]&& echo 1||echo 0
0
[root@node01 ~]# [ ! -f file ]&& echo 1||echo 0 
1

[ ] 与[[ ]]

[[ ]]
这是内置在shell中的一个命令,它就比刚才说的[ ]强大的多了。支持字符串的模式匹配(使用=~操作符时甚至支持shell的正则表达 式)。简直强大的令人发指!逻辑组合可以不使用test的-a,-o而使用&&,||这样更亲切的形式(针对c、Java程序员)。

首先,尽管很相似,但是从概念上讲,二者是不同层次的东西。
“[[]]”,是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。
“[]”,是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"[]“与"test"是内部(builtin)命令,换句话说执行"test”/"["时不会调用/some/path/to/test这样的外部命令(如果有这样的命令的话)。

其次,[[]]结构比Bash版本的[]更通用。在[[和]]之间的所有的字符都不会被文件扩展或是标记分割,但是会有参数引用和命令替换。
用[[ … ]]结构比用[ … ]更能防止脚本里的许多逻辑错误。比如说,&&,||,<和>操作符能在一个[[]]测试里通过,但在[]结构会发生错误。

第三,[ … ]为shell命令,所以在其中的表达式应是它的命令行参数,因此串比较操作符">" 与"<“必须转义,否则就变成IO改向操作符了(请参看上面2中的例子)。在[[中”<“与”>“不需转义;
由于”[["是关键字,不会做命令行扩展,因而相对的语法就稍严格些。例如
在[ … ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ … ]]则不允许这样做。

第四,[[ … ]]进行算术扩展,而[ … ]不做。

最后,[[ … && … && … ]] 和 [ … -a … -a …] 不一样,[[ ]] 是逻辑短路操作,而 [ ] 不会进行逻辑短路
在这里插入图片描述

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值