Shell 条件判断

2021-09-21 17:28:04
admin
1691
最后编辑:admin 于 2021-09-26 10:24:16

条件测试

如果之前学过其他编程语言,那么对于 if 语句应该很了解,不同语言的 if 条件结构大同小异。都是根据 if 后面的条件测试结果的真假,来决定后面代码执行的逻辑。

在 Shell 中,if 后面可以直接跟一个命令,也可以跟条件测试。

shell中每个命令都有一个退出状态码,如果命令正常运行完成,则其退出状态为0,测试条件判断为真!如果执行出现错误,则其退出状态码为非0值,测试条件判断为假!

注:如果 if 后面跟的是条件测试,条件测试须要放在方括号[  ]之间,并且左右要有空格。例如:

 [$a=$b] 是错误的,必须写成 [ $a = $b ]。

if条件判断语句

下面是列举了 if 条件语句的常见形式,与其他语言用法基本相同,这里只说明两点:

  1. Shell 中 if 语句须以 fi 结束(if 的倒写);

  2. Shell中对于多条件判断,使用 elif 结构;

if [ 条件测试 ]
then
    语句           #如果条件为真,则执行 then 后面的语句,否则退出 if 语句。
    ……
fi

#then 可以放在和 if 同一行,并用分号 ; 隔开。故下面结构与上面同效:

if [ 条件测试 ];then
    语句              
    ……
fi
if [ 条件测试 ]
then
    语句
    ……
else                #如果条件为真,则执行 then 后面的语句,否则执行 else 后面的语句。
    语句
    ……
fi
if [ 条件测试1 ]
then               #如果条件1为真,则执行 then 后面的语句,否则判断条件2
    语句
    ……
elif [ 条件测试2 ]  #如果条件2为真,则执行 then 后面的语句,否则执行 else 后面的语句。
then
    语句
    ……
else
    语句
    ……
fi

注:在 elif 语句中,紧跟其后的 else 语句属于 elif 代码块。它们不属于之前的 if-then 代码块。


下面根据各种不同的测试条件类型,来熟悉下 if 条件语句的使用。

整数比较

N1 -eq N2    #比较N1是否等于N2。

N1 -ne N2    #比较N1是否不等于N2。

N1 -gt N2     #比较N1是否大于N2。

N1 -lt N2      #比较N1是否小于N2。

N1 -ge N2    #比较N1是否大于等于N2。

N1 -le N2     #比较N1是否小于等于N2。

注:bash shell 只能处理整数!

实例:

#!/bin/bash
a=7
b=15
if [ $a -gt $b ]; then
  echo a 大于 b!
else
  echo a 大于 b 不成立!
fi

执行结果:

$ ./test.sh  
a 大于 b 不成立!

字符串比较

Shell中,空格也是字符串本身的一部分。

string1 = string2        #判断两个字符串是否相等 (注意只有一个=)

string1 != string2       #判断两个字符串是否不相等

-n string                     #判断字符串是否为非空串(长度是否非0)

-z string                     #判断字符串是否为空串(长度是否为0)

注:比较字符串相等性时,区分大小写!

如果变量未被定义,则其长度也为0。(shell中,一切变量都是字符串)

实例:

#!/bin/bash
a="Hello World"
b="HelloWorld"
c="helloworld"
if [ $b = "$a" ]; then
  echo b 等于 a
elif [ $b = $c ]; then
  echo b 等于 c
else
  echo b 不等于a,也不等于c!
fi

执行结果:

$ ./test.sh
b 不等于a,也不等于c!

这里插入一个问题,大家讨论下:第5行代码中,$a 为什么要加引号呢?

文件比较(检查文件/目录的状态)

-d file      #检查file是否存在并是一个目录

-e file      #检查file是否存在(可用于文件和目录)

-f file      #检查file是否存在并是一个文件

-r file      #检查file是否存在并可读

-s file      #检查file是否存在并非空

-w file      #检查file是否存在并可写

-x file      #检查file是否存在并可执行

-O file      #检查file是否存在并属当前用户所有

-G file      #检查file是否存在并默认组与当前用户相同

file1 -nt file2    #检查file1是否比file2新

file1 -ot file2    #检查file1是否比file2旧

这些测试条件使你能在 Shell 脚本中检查文件系统中的文件。它们经常出现在需要进行文件访问的脚本中。例如:

  • 要将文件写入目录或切换目录时,先检查目录是否存在;

  • 要使用某文件或目录时,先检查其是否存在;

  • 尝试从文件中读/写/执行之前,先检查文件是否存在并可读/写/执行;

实例:

#!/bin/bash
if [ -x test.sh ]; then
  echo "You can run the script."
else
  echo "You can not run the script!"
fi

执行结果:

$ ./test.sh  
You can run the script.

逻辑运算(复合条件测试)

and 逻辑: &&

or 逻辑: ||

如:

[ condition1 ]  && [ condition2 ]
[ condition1 ] || [ condition2 ]

实例:

#!/bin/bash
if [ -e test.sh ] && [ -x test.sh ]; then
  echo "You can run the script."
else
  echo "You can not run the script!"
fi

执行结果:

$ ./test.sh  
You can run the script.

case多条件判断语句

对于存在更多的条件判断情况时,不建议重复使用 elif 语句,此时建议使用 case 语句(类似其他编程语言中的 switch 语句):

case $var in
value1 | value2)
    语句
    ……;;
value3)
    语句
    ……;;
value4)
    语句
    ……;;
*)
    语句
    ……;;
esac

实例:

#!/bin/bash
a=1
case $a in
0)
  echo a equals 0;;
1)
  echo a equals 1;;
2)
  echo a equals 2;;
*)
  echo who are you!;;
esac

执行结果:

$ ./test.sh  
a equals 1

注:

可以通过竖线 | 操作符在一行中分隔出多个模式。

*会捕获所有与已知模式不匹配的值。

在shell中,exit语句可以终止shell程序的执行。