7月12日任务

20.5 shell脚本中的逻辑判断
20.6 文件目录属性判断
20.7 if特殊用法

20.8/20.9 case判断

shell脚本中的逻辑判断

7月12日任务

格式① if .... then.... fi

7月12日任务

注意看区别和错误,变量前一定要加标识符$,否则被认为就是普通的字符,判断句中符号之间需要加空格,否则报错

脚本形式:

7月12日任务

7月12日任务

格式② if ..... then ..... else .... .fi

7月12日任务

7月12日任务

格式③if.....then; elif..... then;else......then; fi

-gt 大于,-lt 小于 -eq 等于 -ge大于等于 -le小于等于 -ne不等于 if [ $a -gt $b ]; if [$a -eq $c ]; 

支持逻辑运算&&和 ||;e.g. if [ $a -gt 6 ] && [ $a -lt 9 ]   if [ $b -gt 9 ] || [$b -lt 3 ]

文件目录属性判断

-f判断是否是普通文件且存在 -d判断是否为目录且存在 -e判断是否为普通文件或目录且存在 -r, -w, -x 依次为可读可写可执行

示例:

7月12日任务

执行报错,因为没有写fi结尾; 还有第二行目录不存在报错,因为多写了一个空格

7月12日任务

sh -x 查看脚本执行过程;如下图所示,系统自动进行了一次判断的过程

7月12日任务

-d 查看是否为目录,touch的作用, 如果某文件/目录存在会修改文件的atime, ctime, mtime,如果不存在则会创建,如下图

7月12日任务

即使执行两次也会判断使用touch,因为$f不是目录,但是存在,只会跳到下一个判断句上即本例中的touch $f

7月12日任务

-e判断某文件或者目录是否存在

7月12日任务

sh -x查看脚本执行过程,由于文件存在,所以直接执行结束选择echo exists

7月12日任务

如下图,-r, -w, -x脚本

7月12日任务

脚本示例①==②; ③==④;&&只有在前面是true才会执行后面的, ||逻辑判断只有在前面是false才会执行后面的语句,!表示取反,即! -f和-f互为反义

7月12日任务

if的特殊用法

新脚本

7月12日任务

如上图所示,如果定义的变量n没有值时(即如上图中为空),执行脚本会报错

7月12日任务

把空值放入脚本中执行,出现bug,如果参与项目中,会影响整个项目的效果;为了让脚本更严谨,质量更高,需要进行一些判断,如加入判断n是否有值[ -z "a"] [-n "a"],两者互为反,前者表示为空,后者表示不为空,如下图

7月12日任务

改良版(elif)

7月12日任务

更严谨的判断,先判断文件/tmp/xxxxx是否存在,如果不存在直接exit 否则再执行下面的判断语句,可以把$n是否为空的部分删除因为前面已经进行过一次判断了

7月12日任务

7月12日任务

-n(不为空)可以即判断变量也可以判断文件

例子:

7月12日任务

注意查看$b和b的区别,-n判断不为空时跟文件可以不加双引号,跟变量需要添加

在逻辑判断中可以使用一个命令的结果作为判断的条件;如某个文件中是否含有某些字符串,例子(判断系统中的用户中是否有user1)

7月12日任务

-w更加精准匹配,grep中有-q选项可以不输出匹配文件内容,!可以取反,并加上相应的条件句

case判断

7月12日任务

如上图所示case判断+变量名如$f in value1 ;可以使用|表示或,如|2, |3

脚本示例:

7月12日任务

read命令:让用户输入一些字符串,并返回定义的变量如本例中的变量n,echo$n则会输出输入的值

7月12日任务

新建一个test.sh只看下图这部分,if判断如果变量n为空,则输出Please input a number.并有一个返回值1,可用echo $?查看;0表示OK,1表示有问题(和编译安装中的make&make install后查看返回值类似)

7月12日任务

第二段

7月12日任务

定义一个变量n1,把之前变量n的值用sed进行替换/g成空,再进行下面的判断,如果变量n1不为空(表示之前输入的变量n不是  纯数字),则执行then后面的操作,即提示“请输入数字”,返回1,表示错误;如果变量n1为空则说明输入的为纯数字,合法,继续执行下面的脚本

第三段

7月12日任务

继续判断n的大小,分4种情况,用case判断如上图

7月12日任务

7月12日任务