shell条件判断

Bash里用作条件判断的有test命令,各种中括号和圆括号操作,和if/then结构。

if/then结构用来判断命令列表的退出状态码是否为0(0表示成功),如果成功,那么就执行接下来的一个或多个命令。

“[”中括号是一个专有命令,这个命令与test命令等价,并且处于效率上的考虑,这是一个内建命令。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码(0表示真,1表示假)。

版本2.02之后,引入了[[...]]扩展测试命令,因为这种表现形式可能对某些语言的程序员来说更熟悉。注意[[是一个关键字,并不是一个命令。

   Bash把[[ $a -lt $b ]]看作是一个单独的元素,并且返回一个退出状态码。

if命令能够测试任何命令,并不仅仅是中括号中的条件。

一个if/then结构可以包含嵌套的比较操作和条件判断操作

if [ condition-true ]

then

       command 1

       command 2

       ...

else

        command 3

        command 4

         ...

fi


Else if 和 elif

   elif是else if的缩写形式。作用是在外部的判断结构中再嵌入一个内部的if/then结构。

if [ condition1 ]

then

       command1

       command2

elif [ condition2 ]

then

       command3

       command4

else

       default-command

fi

if test condition-true结构与if [ condition-true ] 完全相同。左中括号,是调用test命令的标识。而关闭条件判断用的是右中括号。右中括号在if/test结构中并不是严格必须的,但在Bash的新版本中必须要求使用。


test命令在Bash中是内建命令,用来测试文件类型,或者用来比较字符串。因此,在Bash脚本中,test命令不会调用外部的/usr/bin/test中的test命令,这是sh-utils工具包中的一部分。同样的,[ 也不会调用/usr/bin/[,这是/usr/bin/test的符号链接。

test, /usr/bin/test, [ ] 和/usr/bin/[都是等价命令。

[[ ]]结构比[ ] 结构更加通用。这是一个扩展的test命令。

使用[[...]]而不是[...],能够防止脚本中的许多逻辑错误。比如,&& || < >操作符能够正常存在于[[]]条件判断结构中,但是如果出现在[ ]结构中则会报错。

在if后面不一定非得是test命令或用于条件判断的中括号结构。也可以是"if COMMAND"结构,它将会返回COMMAND的退出状态码。

算术测试使用的是(( ))结构。如果表达式的结果为0,那么返回的退出状态码为1,或者是假。而一个非零值的表达式所返回的退出状态码将为0,或者是真。这和之前的test命令和[ ]结构的行为正好相反。


文件测试操作符

如果下面的条件成立将会返回真。

-e                文件存在

-f                  这是一个一般文件(并不是目录或者设备文件)

-s                 文件大小不为零

-d                 这是一个目录

-b                 这是一个块设备(软盘,光驱等等)

-c                 这是一个字符设备(键盘,modem,声卡等等)

-p                 这个文件是一个管道

-h                 这是一个符号链接

-L                 这是一个socket

-t                  文件(描述符)被关联到一个终端设备上

-r                  文件是否具有可读权限。

-w                 文件是否具有可写权限

-x                 文件是否具有可执行权限

-g                 set-group-id(sgid)标记被设置到文件或目录上

-u                 set-user-id(suid)标记被设置到文件上

-k                 设置粘贴位

-O                 判断你是否是文件的拥有者

-G                 文件的group-id是否与你的相同

-N                 从文件上一次被读取到现在为止,文件是否被修改过

f1 -nt f2         文件f1比文件f2新

f1 -ot f2          文件f1比文件f2旧

f1 -ef f2         文件f1和文件f2是相同文件的硬链接

!                   “非”,翻转上边所有测试的结果(如果没给出条件,那么返回真)


比较操作符

整数比较

-eq                等于

-ne                 不等于

-gt                  大于

-ge                 大于等于

-lt                    小于

-le                   小于等于

<                     小于(以下与<和>相关的符号都是在双括号中使用用于算术测试)

<=                   小于等于

>                      大于

>=                    大于等于


 字符串比较

=和==            等于,这两个符号等价

==比较操作在双中括号和单中括号中的行为是不同的。

[[ $a == z* ]]       如果$a以"z"开头(模式匹配),那么结果将为真

[[ $a == "z*" ]]     如果$a与z*相等(字面意思完全一样),那么结果将为真

[ $a == z* ]          文件扩展匹配和单词分割有效

[ "$a" == "z*" ]     同双括号


!=                  不等号。

<                  小于,按照ASCII字符进行排序

if  [[ "$a" < "$b" ]]

if  [ "$a" \< "$b" ] 在单括号结构中使用需要进行转义

>                 大于

-z                 字符串为"null",意思就是字符串长度为零

-n                 字符串不为"null"


-a                  逻辑与

-o                  逻辑或

这两个与比较操作符&&和||非常相像,但是这两个操作符是用在双中括号结构中的

[[ condition1 && condition2 ]]

if[ “$exp1” -a "$exp2" ]          -o和-a操作符一般都是和test命令或者是单中括号结构一起使用的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值