Shell语法——if else详解

本文详细介绍了Bash脚本中的条件判断语法,包括if结构、赋值与比较时空格的使用规则、不同括号的区别,如(())、[]和[[]],以及比较运算符的用法。特别提到了字符串和数字的比较,逻辑运算符的差异,以及文件存在性与权限的判断。内容涵盖了Bash编程中的关键知识点。
摘要由CSDN通过智能技术生成

一、语法格式

if 条件; then
	command1
else
	command2
fi

二、判断条件

1、空格的使用

严格规定:

  • 赋值语句中等号=两边不能有空格,而字符串比较中等号=、==两边必须有空格。
  • 中括号[]、[[]]前后必须有空格。
i=1   # =用作赋值时,两边绝对不能有空格           
if [ $a = $b ] # =、==等用作比较判断时,两边必须有空格;中括号前后一定要加空格。

2、不同括号的区别

if条件中:(())、[]、[[]],区别如下:
(1)(())只能用于整数比较,不能用于字符串比较,括号中的变量可以省略$符号前缀。
(2)[]和[[]]的区别:

  • 本质上,[]和test是等价的,都是命令,而[[]]是关键字,所以重定向等字符在[]中会被认为重定向,而在[[]]中是比较。
  • &&、||、<、>操作符可以作用于[[]],而在[]中会报错。用法:if [[ $a != 1 && $b != 2 ]],或:if [
    $a != 1 ] && [ $b != 2 ]
  • [[]]支持字符串的模式匹配,而[]不支持。使用=或==进行字符串比较时,等号右边可以作为一个模式,比如[[ “hello” == hell? ]]结果为真,模式匹配不加引号。
  • 支持算术扩展,而[]不支持,如:if [[ 1+2 -eq 3 ]]。

3、比较运算符

比较字符串

比较字符串只能使用=、==、<、>、!=、-z、-n。其中,-n表示字符串不为空,即长度大于0,-z表示字符串为空,即长度为0。
备注:

  • 使用[]对比字符串时,末尾一定要加上x(或者a、b等)一个字符,因为[ a x = = " a b " x ] 如果没有了 x ,并且 ax == "ab"x ]如果没有了x,并且 ax=="ab"x]如果没有了x,并且a是"",这个语句会翻译成if [ == “ab” ],左边相当于没有东西了,会报语法错误。或者使用[[ ]],就不需要x了。
  • 使用<或者>时,如果是用[],需要用转义\,如>。
  • 使用-z -n时,如果是用 [],则字符串一定要加双引号(单引号都不行),如:[ -n “$a”
    ];如果是用[[]],则加不加双引号都可以(但一定不能加单引号)。
比较数字

对比数字,只能使用==、=、!=,或者 -eq、-ne、-gt、-ge、-lt、-le。其中-eq的意思是 equal,-ne是 unequal,-gt是 greater than,-ge是 greater than or equal to,-lt是 less than,-le是 less than or equal to。
备注:

  • 在[] [[]]中,数字对比不支持 > < <= 和>=,比如[[ 1 -gt -1 ]]为真,但[[ 1 > -1 ]]为假。
  • 在(())中,数字对比是支持 > < <= 和>= 的,但不支持
    -eq、-ne、-gt、-ge、-lt、-le等。这是因为括号内只要符合C语言规则的运算符都可以。
=与==的区别(字符串和数字均适用):
1、在 [ ] 或 [[]] 中,= 与 == 表示判断,是等价的
2、在·(( )) 中, = 表示赋值, == 表示判断,它们不等价

4、逻辑运算符

and可以用-a 或 &&表示,or可以用-o或||表示。它们在[]和[[]]是不同的:

  • [[]]只能使用&& ||,不能使用-a-o。&&||写在括号里或外都可以。
  • (())与[[]]相同,只不过可以省略变量前的$,且只能用于整数比较。
  • []既可以使用&& ||,也可以使用-a-o。但&&||必须在括号外,-a``-o必须在括号内。

比如a=3 ; b=2 ; c=4,要判断是否a>b且a<c,有以下几种正确的写法:

if (( a > b )) && (( a < c )) # 正确
if (( a > b && a < c )) # 正确
if [[ $a -gt $b ]] && [[ $a -lt $c ]] # 正确
if [[ $a -gt $b && $a -lt $c ]] # 正确
if [ $a -gt $b ] && [ $a -lt $c ] # 正确
if [ $a -gt $b -a $a -lt $c ] # 正确

5、文件判断

判断文件夹或文件是否存在

#文件夹不存在则创建,文件夹存在则删除
if [ ! -d "/data/" ]; then
	mkdir /data
else
	rm -rf /data
fi
#文件存在则删除
if [ ! -f "/data/filename" ]; then
	echo "文件不存在"
else
	rm -f /data/filename
fi
文件比较符:
  • -e 判断对象是否存在
  • -d 判断对象是否存在,并且为目录
  • -f 判断对象是否存在,并且为常规文件
  • -L 判断对象是否存在,并且为符号链接
  • -h 判断对象是否存在,并且为软链接
  • -s 判断对象是否存在,并且长度不为0
  • -r 判断对象是否存在,并且可读
  • -w 判断对象是否存在,并且可写
  • -x 判断对象是否存在,并且可执行
  • -O 判断对象是否存在,并且属于当前用户
  • -G 判断对象是否存在,并且属于当前用户组
  • -nt 判断file1是否比file2新 [ “/data/file1” -nt “/data/file2” ]
  • -ot 判断file1是否比file2旧 [ “/data/file1” -ot “/data/file2” ]

注:本文由博主搜集整理而来,不用于任何商业用途,如有侵权,请联系博主删帖!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值