-20.5shell脚本中的逻辑判断 -20.6文件目录属性判断 -20.7if特殊用法 -20.8/20.9case判断 #20.5Shell脚本中的逻辑判断 -很多脚本可以直接用命令执行,比如之前的那个 ``` [root@aming-01~]#foriin`seq15`;doecho$i;done 1 2 3 4 5 [root@aming-01~]#foriin`seq15` >do >echo$i >done 1 2 3 4 5 [root@aming-01~]# ``` -格式1:if条件;then语句;fi -下面来写个脚本 -a=5,如果a大于3就打印ok -如果写成一行就下面这样 ``` [root@aming-01~]#a=5 [root@aming-01~]#if[$a-gt3] >then >echook >fi ok [root@aming-01~]# [root@aming-01~]#if[$a-gt3];thenechook;fi ok [root@aming-01~]# ``` -用脚本的形式编辑下,就是 ``` [root@aming-01shell]#viif1.sh #!/bin/bash a=5 if[$a-gt3] then echook fi ~ ~ ~ ~ :wq [root@aming-01shell]#shif1.sh ok [root@aming-01shell]# ``` -格式2:if条件;then语句;else语句;fi -如果满足条件怎么样,不满足又会怎么样 ``` [root@aming-01shell]#cpif1.shif2.sh [root@aming-01shell]#viif2.sh #!/bin/bash a=1 if[$a-gt3] then echook else echonotok fi ~ ~ ~ :wq [root@aming-01shell]#sh-xif2.sh +a=1 +'['1-gt3']' +echonotok notok [root@aming-01shell]# ``` -格式3:if…;then…;elif…;then…;else…;fi --gt指的是大于-lt指的是小于 ``` [root@aming-01shell]#cpif2.shif3.sh [root@aming-01shell]#viif3.sh #!/bin/bash a=5 if[$a-gt1] then echo">1" elif[$a-lt6] then echo"<6&&>1" else echonotok fi ~ ~ ~ :wq [root@aming-01shell]#viif3.sh [root@aming-01shell]#catif3.sh #!/bin/bash a=5 if[$a-gt1] then echo">1" elif[$a-lt6] then echo"<6&&>1" else echonotok fi [root@aming-01shell]# [root@aming-01shell]#sh-xif3.sh +a=5 +'['5-gt1']' +echo'>1' >1 [root@aming-01shell]# ``` -改下 ``` [root@aming-01shell]#viif3.sh #!/bin/bash a=5 if[$a-gt4] then echo">1" elif[$a-lt6] then echo"<6&&>1" else echonotok fi ~ ~ :wq [root@aming-01shell]#sh-xif3.sh +a=5 +'['5-gt4']' +echo'>1' >1 [root@aming-01shell]# ``` -if判断的三种格式 ``` [root@aming-01shell]#if...;then...;fi^C [root@aming-01shell]#if...;then...;else...;fi^C [root@aming-01shell]#if...;thn...;elif...then...;else...;fi^C [root@aming-01shell]# ``` -逻辑判断表达式:if[$a-gt$b];if[$a-lt5];if[$b-eq10]等-gt(>);-lt(<);-ge(>=);-le(<=);-eq(==);-ne(!=)注意到处都是空格 -gt大于lt小于eq等于 --ge大于等于-le小于等于-ne不等于 ``` [root@aming-01shell]#gtlteq-ne-ge-le^C ``` -可以使用&&||结合多个条件&&并且||或者 -if[$a-gt5]&&[$a-lt10];then -if[$b-gt5]||[$b-lt3];then #20.6文件目录属性判断 -shell中我们通常和文件、目录打交道,所以对文件目录的判断很重要 -if判断文件、目录属性 -[-ffile]判断是否是普通文件,且存在 -举例 ``` Lastlogin:TueNov2119:49:552017 [root@aming-01~]#vifile1.sh #!/bin/bash f="/tmp/aminglinux" if[-f$f] then echo$fexist else touch$f fi ~ ~ ~ :wq [root@aming-01~]#vifile1.sh [root@aming-01~]#sh-xfile1.sh +f=/tmp/aminglinux +'['-f/tmp/aminglinux']' +touch/tmp/aminglinux [root@aming-01~]# ``` -解释:首先f回去判断这个文件到底存在与否,很明显不存在,于是就创建了一个/tmp/aminglinux文件 -那我们再次执行这个脚本,很明显这个文件已经存在了,所以echo/tmp/aminglinuxexist ``` [root@aming-01~]#sh-xfile1.sh +f=/tmp/aminglinux +'['-f/tmp/aminglinux']' +echo/tmp/aminglinuxexist /tmp/aminglinuxexist [root@aming-01~]# ``` -这里把这个脚本移到shell/目录下面来,以为脚本文件我们统一放在/shell目录里 ``` [root@aming-01~]#ls aming.txtanaconda-ks.cfgfile1.shshellzabbix-release-3.2-1.el7.noarch.rpm [root@aming-01~]#cdshell/ [root@aming-01shell]#mv/root/file1.sh. [root@aming-01shell]#ls 01.shfile1.shif1.shif2.shif3.sh ``` -[-dfile]判断是否是目录,且存在 ``` [root@aming-01shell]#cpfile1.shfile2.sh [root@aming-01shell]#vifile2.sh #!/bin/bash f="/tmp/aminglinux" if[-d$f] then echo$fexist else touch$f fi ~ ~ ~ :wq [root@aming-01shell]#vifile2.sh [root@aming-01shell]#sh-xfile2.sh +f=/tmp/aminglinux +'['-d/tmp/aminglinux']' +touch/tmp/aminglinux [root@aming-01shell]# ``` -很明显他不适目录,不适目录就touch一个目录 -还有一种情况,我不管它是文件还是目录,我仅仅是想知道这个文件或者目录到底存在不存在 -[-efile]判断文件或目录,是否存在 ``` [root@aming-01shell]#vifile2.sh #!/bin/bash f="/tmp/aminglinux" if[-e$f] then echo$fexist else touch$f fi ~ ~ :wq [root@aming-01shell]#vifile2.sh [root@aming-01shell]#sh-xfile2.sh +f=/tmp/aminglinux +'['-e/tmp/aminglinux']' +echo/tmp/aminglinuxexist /tmp/aminglinuxexist [root@aming-01shell]# ``` -判断这个目录或者文件是否存在,不存在就创建一个目录或者文件 -如果这个文件存在touch会是摸一下文件或者目录,改变文件和目录的三个time值AtimeCtimeMtime -[-rfile]判断文件是否可读 ``` [root@aming-01shell]#vifile2.sh #!/bin/bash f="/tmp/aminglinux" if[-r$f] then echo$freadable fi ~ ~ :wq [root@aming-01shell]#vifile2.sh [root@aming-01shell]#shfile2.sh /tmp/aminglinuxreadable [root@aming-01shell]# ``` -显示这个文件是可读的 -[-wfile]判断文件是否可写 ``` [root@aming-01shell]#vifile2.sh #!/bin/bash f="/tmp/aminglinux" if[-w$f] then echo$fwriteable fi ~ ~ ~ ~ :wq [root@aming-01shell]#vifile2.sh [root@aming-01shell]#!sh shfile2.sh /tmp/aminglinuxwriteable [root@aming-01shell]# ``` -文件可写 -可读可写可执行是针对当前用户root来说的 ``` [root@aming-01shell]#ls-l/tmp/aminglinux -rw-r--r--1rootroot011月2120:09/tmp/aminglinux [root@aming-01shell]# ``` -[-xfile]判断文件是否可执行 ``` [root@aming-01shell]#vifile2.sh #!/bin/bash f="/tmp/aminglinux" if[-x$f] then echo$fexeable fi ~ ~ :wq [root@aming-01shell]#vifile2.sh [root@aming-01shell]#shfile2.sh [root@aming-01shell]# ``` -因为它不可执行,所以没有任何的输出 -因为我们根本就没有定义else ``` [root@aming-01shell]#catfile2.sh #!/bin/bash f="/tmp/aminglinux" if[-x$f] then echo$fexeable fi [root@aming-01shell]# ``` -这样用的比较多 -常用案例 并且 ``` f="/tmp/aminglinux" [-f$f]&&rm-f$f//前一条命令执行成功才会继续执行之后的命令 等同于下面的表达方式 if[-f$f] then rm-rf$f fi ``` -或者 ``` f="/tmp/aminglinux" [-f$f]||touch$f//前面命令不成功时,执行后面的命令 if[!-f$f]//“!”表示了如果这条命令不成功,就往下执行(!表示取反) then touch$f fi ``` #20.7if特殊用法 -if[-z"$a"]这个表示当变量a的值为空时会怎么样 ``` [root@aming-01shell]#viif4.sh #!/bin/bash n=`wc-l/tmp/lalal` if[$n-gt100] then echoalsdflljk fi ~ :wq [root@aming-01shell]#viif4.sh [root@aming-01shell]#sh-xif4.sh ++wc-l/tmp/lalal wc:/tmp/lalal:没有那个文件或目录 +n= +'['-gt100']' if4.sh:第3行:[:-gt:期待一元表达式 [root@aming-01shell]# ``` -当变量没有值的时候会报错,为了让这个脚本更加严谨,应该做一些判断 -if[-z"$a"]这里表示当变量a的值为空时就echoerror并且exit ``` [root@aming-01shell]#viif4.sh #!/bin/bash n=`wc-l/tmp/lalal` if[-z"$n"] then echoerror exit elif[$n-gt100] then echoalsdflljk fi ~ :wq [root@aming-01shell]#viif4.sh [root@aming-01shell]#sh-xif4.sh ++wc-l/tmp/lalal wc:/tmp/lalal:没有那个文件或目录 +n= +'['-z''']' +echoerror error +exit [root@aming-01shell]# ``` -再改进一下,这样它就不再报错了 ``` [root@aming-01shell]#!vi viif4.sh #!/bin/bash if[!-f/tmp/lalal] then echo"/tmp/lalalnotexist." exit fi n=`wc-l/tmp/lalal` if[-z"$n"] then echoerror exit elif[$n-gt100] then echoalsdflljk fi ~ ~ :wq [root@aming-01shell]#shif4.sh /tmp/lalalnotexist. [root@aming-01shell]# ``` -if[-n"$a"]表示当变量a的值不为空 -用变量的时候要用双引号引起来,如果是一个文件,那就不用了 --这个[-n"$a"]是可以判断文件的,判断一个文件的内容是否不为空,条件成立 ``` [root@aming-01shell]#ls 01.shfile1.shfile2.shif1.shif2.shif3.shif4.sh [root@aming-01shell]#if[-n01.sh];thenechook;fi ok [root@aming-01shell]# ``` -同样可以判断变量 -解释:当变量b不为空,那么echo$b,否则当变量b为空,那么echobisnull,这里变量b是为空的 --n和-z用法,如果不是变量,不需要双引号“”;因为这两个是针对文件执行的; ``` [root@aming-01shell]#echo$b [root@aming-01shell]#if[-n"$b"];thenecho$b;elseecho"bisnull";fi bisnull [root@aming-01shell]# ``` -比如判断系统的用户里面是否有user1这个用户 ``` [root@aming-01~]#useradduser1 [root@aming-01~]#cdshell [root@aming-01shell]#grep-w'user1'/etc/passwd user1:x:1011:1011::/home/user1:/bin/bash [root@aming-01shell]# ``` -表示如果/etc/passwd中含有'user1'的字符时会怎么样 --w更加精准的匹配,只匹配‘’内的单词 -如果/etc/passwd里包含user1,那么就说user1existuser1存在 ``` [root@aming-01shell]#ifgrep-w'user1'/etc/passwd;thenecho"user1exist";fi user1:x:1011:1011::/home/user1:/bin/bash user1exist [root@aming-01shell]# ``` -只不过这个判断的过程是会输出过滤的语句出来,把这个结果给输出出来,grep-q仅仅是做一个过滤,但是不会吧过滤的内容显示出来 ``` [root@aming-01shell]#ifgrep-wq'user1'/etc/passwd;thenecho"user1exist";fi user1exist [root@aming-01shell]# ``` -反过来怎么表示呢,如果这个user1不存在 -如果user1不存在,加个!表示取反的意思,那么useradduser1 -只不过这个操作过程不成立的,因为user1本身就存在了后面这个命令不生效的then"useradduser1" ``` [root@aming-01shell]#if!grep-wq'user1'/etc/passwd;then"useradduser1";fi [root@aming-01shell]# ``` -if[!-efile];then表示文件不存在时会怎么样 -if(($a<1));then…等同于if[$a-lt1];then… []中不能使用<,>,==,!=,>=,<=这样的符号 #20.8case判断(上) ``` -格式case变量名in value1) command ;; value2) command ;; *) commond ;; esac ``` -在case程序中,可以在条件中使用|,表示或的意思,比如 ``` 2|3) command ;; ``` -shell脚本案例: ``` [root@aming-01shell]#vicase.sh ~ "case.sh"[NewFile] ``` -加入以下脚本 ``` [root@aming-01shell]#vicase.sh #!/bin/bash read-p"Pleaseinputanumber:"n if[-z"$n"] then echo"Pleaseinputanumber." exit1 fi n1=`echo$n|sed's/[0-9]//g'` if[-n"$n1"] then echo"Pleaseinputanumber." exit1 fi if[$n-lt60]&&[$n-ge0] then tag=1 elif[$n-ge60]&&[$n-lt80] then tag=2 elif[$n-ge80]&&[$n-lt90] then tag=3 elif[$n-ge90]&&[$n-le100] then tag=4 else tag=0 fi case$tagin 1) echo"notok" ;; 2) echo"ok" ;; 3) echo"ook" ;; 4) echo"oook" ;; *) echo"Thenumberrangeis0-100." ;; esac ``` -脚本命令解释 -read-p"Pleaseinputanumber:"n if[-z"$n"] -read-p的作用,n作为你要捕获一个变量的名字,用户输入什么数值,最终这个n这个变量就会赋值什么东西 ``` [root@aming-01shell]#read-p"Pleaseinputanumber:"n Pleaseinputanumber: Pleaseinputanumber;kdkdk [root@aming-01shell]#echo$n kdkdk [root@aming-01shell]# [root@aming-01shell]#echo$n 123 [root@aming-01shell]# ``` -if[-z"$n"]表示当用户没有输入东西的时候为空的时候if[-z"$n"]表示为空的时候,说明用户没有输入,那奥告诉他echo"Pleaseinputanumber."请输入一个数字 -这里的exit1,这个1表示当一个命令一个语句运行完之后都会有一个返回的值,echo$?输出结果为0表示命令语句是正确的,如果是1那就是错误这里的exit1就是那个echo$?的输出的值 -n1=`echo$n|sed's/[0-9]//g'` if[-n"$n1"] -这里的变量判断的时你输入的字符串是不是纯数字,万一输入的时1a1或者纯字母aaa呢,都需要去判断下,如果不是那就要做一个操作,把里面的数字做一个清空 -当你的变量不为空时,if[-n"$n1"]表示$n1不为空时,继续提示让你输入一个纯数字 ``` n1=`echo$n|sed's/[0-9]//g'` if[-n"$n1"] then echo"Pleaseinputanumber." exit1 ``` #20.9case判断(下) ``` fi if[$n-lt60]&&[$n-ge0] then tag=1 ``` -当你输入的时数字的时候,数字满足[$n-ge0]大于等于0并且[$n-lt60]小于60,那么作为标记1tag1是个变量 -如果不是上述情况 ``` elif[$n-ge60]&&[$n-lt80] then tag=2 ``` -[$n-ge60]是大于等于60并且[$n-lt80]小于80那么作为标签2 -同理 ``` elif[$n-ge80]&&[$n-lt90] then tag=3 ``` -如果n满足[$n-ge80]大于等于80并且[$n-lt90]小于90为标签3 -同理 ``` elif[$n-ge90]&&[$n-le100] then tag=4 ``` -如果n[$n-ge90]大于等于90并且[$n-le100]小于等于100,为标签4 -同理 ``` else tag=0 ``` -除此之外标记标签0 -case格式 ``` case$tagin 1) echo"notok" ;; 2) echo"ok" ;; 3) echo"ook" ;; 4) echo"oook" ;; *) echo"Thenumberrangeis0-100." ;; ``` -满足标签1输出notok -满足标签2输出ok -满足标签3输出ook -满足标签4输出oook -其他不再这个范围内输出"Thenumberrangeis0-100."数字范围为0-100 -下面来测试下脚本分别输入不同的数字或者其他来测试下 -比如数字101,提示数字范围在0-100 ``` [root@aming-01shell]#shcase.sh Pleaseinputanumber:101 Thenumberrangeis0-100. [root@aming-01shell]# ``` -来看下它的执行过程 ``` [root@aming-01shell]#sh-xcase.sh +read-p'Pleaseinputanumber:'n Pleaseinputanumber:101 +'['-z101']' ++echo101 ++sed's/[0-9]//g' +n1= +'['-n''']' +'['101-lt60']' +'['101-ge60']' +'['101-lt80']' +'['101-ge80']' +'['101-lt90']' +'['101-ge90']' +'['101-le100']' +tag=0 +case$tagin +echo'Thenumberrangeis0-100.' Thenumberrangeis0-100. [root@aming-01shell]# ``` -首先判断101这个变量存在不存在,存在继续往下走 -之后做一个判断,存在把数字清空,最后n1为空 -判断它是否不为空,不为空那就正常,正常的话那就往下走,做一个判断 -101是否小于60 -101是否大于等于60 -101是否小于80 -101是否大于等于80 -101是否小于90 -101是否大于等于90 -101是否小于等于100 -这些条件都不满足,所以tag=0所以提示'Thenumberrangeis0-100.'数字范围在0-100 -如果输入78输出ok ``` [root@aming-01shell]#sh-xcase.sh +read-p'Pleaseinputanumber:'n Pleaseinputanumber:78 +'['-z78']' ++echo78 ++sed's/[0-9]//g' +n1= +'['-n''']' +'['78-lt60']' +'['78-ge60']' +'['78-lt80']' +tag=2 +case$tagin +echook ok [root@aming-01shell]# ``` -如果输入88,输出ook ``` [root@aming-01shell]#sh-xcase.sh +read-p'Pleaseinputanumber:'n Pleaseinputanumber:88 +'['-z88']' ++echo88 ++sed's/[0-9]//g' +n1= +'['-n''']' +'['88-lt60']' +'['88-ge60']' +'['88-lt80']' +'['88-ge80']' +'['88-lt90']' +tag=3 +case$tagin +echoook ook [root@aming-01shell]# ``` -如果输入一个不是数字的,提示输入一个数字 ``` [root@aming-01shell]#sh-xcase.sh +read-p'Pleaseinputanumber:'n Pleaseinputanumber:dkkddkdk112 +'['-zdkkddkdk112']' ++echodkkddkdk112 ++sed's/[0-9]//g' +n1=dkkddkdk +'['-ndkkddkdk']' +echo'Pleaseinputanumber.' Pleaseinputanumber. +exit1 [root@aming-01shell]# ```