Shell 条件判断
- 2021-09-21 17:28:04
- admin
- 2212
- 最后编辑:admin 于 2021-09-26 10:24:16
条件测试
如果之前学过其他编程语言,那么对于 if 语句应该很了解,不同语言的 if 条件结构大同小异。都是根据 if 后面的条件测试结果的真假,来决定后面代码执行的逻辑。
在 Shell 中,if 后面可以直接跟一个命令,也可以跟条件测试。
shell中每个命令都有一个退出状态码,如果命令正常运行完成,则其退出状态为0,测试条件判断为真!如果执行出现错误,则其退出状态码为非0值,测试条件判断为假!
注:如果 if 后面跟的是条件测试,条件测试须要放在方括号[ ]之间,并且左右要有空格。例如:
[$a=$b] 是错误的,必须写成 [ $a = $b ]。
if条件判断语句
下面是列举了 if 条件语句的常见形式,与其他语言用法基本相同,这里只说明两点:
Shell 中 if 语句须以 fi 结束(if 的倒写);
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程序的执行。