一、语法格式
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” ]
注:本文由博主搜集整理而来,不用于任何商业用途,如有侵权,请联系博主删帖!