一、shell脚本中的逻辑判断语法:shell
格式1:if 条件 ; then 语句 ; fi vim
格式2:if 条件 ; then 语句; else 语句;fi bash
格式3:if 条件; then 语句;elif 条件;then 语句;else 语句;fispa
逻辑判断表达式:if [ $a -gt $b ];if [ $a -lt 5 ];if [ $b -eq 10 ]等:code
-gt ( > ) -lt ( < ) -ge (>=) -lt(<=) -eq(=) -ne(不等于 !=)input
可使用 &&(而且) ||(或者) 结合多个条件来判断:it
if [ $a -gt 5 ] || [ $a -lt 19 ];thenclass
if [ $b -ge 5 ] && [ $b -lt 10 ];then变量
shell脚本实践:sed
1:for语句循环: for i in `seq 1 5`
[root@localhost_02 ~]# for i in `seq 1 5`;do echo $i;done 1 2 3 4 5 [root@localhost_02 ~]# for i in `seq 1 5` > do > echo $i > done 1 2 3 4 5
2:if判断里面第一种格式: if 条件 ;then 语句;fi
[root@localhost_02 shell]# cat if.sh #!/bin/bash a=3 if [ $a -gt 2 ] then echo ok fi [root@localhost_02 shell]# sh if.sh ok
3:if判断里的第二种格式:if 条件;then 语句;else 语句;fi
[root@localhost_02 shell]# cat if2.sh #!/bin/bash a=5 if [ $a -lt 3 ] then echo ok else echo nook fi [root@localhost_02 shell]# sh if2.sh nook
4:if判断力的第三种格式:if 条件;then 语句;elif 条件 then 语句 else 语句;fi
[root@localhost_02 shell]# cat if3.sh #!/bin/bash a=8 if [ $a -gt 10 ] then echo ">10" elif [ $a -gt 5 ] || [ $a -lt 10 ] then echo ">5 && <10" else echo nook fi [root@localhost_02 shell]# sh -x if3.sh + a=8 + '[' 8 -gt 10 ']' + '[' 8 -gt 5 ']' + echo '>5 && <10' >5 && <10
注释:在一个脚本里,elif能够写多个的,else是除去定义以外的其余条件:
若要使用符号(<>=)等,可使用以下:
[root@localhost_02 shell]# a=3 [root@localhost_02 shell]# if (($a>2));then echo ok;fi ok
注释:逻辑判断表达式:
-gt(>) 大于 -lt(<) 小于 -ge(>=) 大于等于 -le(<=) 小于等于 -eq(=) 等于 -ne(!=) 不等于
二、 if 判断文件目录、属性:
[ -f file ]:判断是否为普通文件,且存在:
[ -d file ]:判断是不是目录,且存在:
[ -e file ]:判断文件或目录是否存在(能够是文件或者目录):
[ -r file ]:判断文件是否可读:
[ -w file ]:判断文件是否可写:
[ -x file ]:判断文件是否可执行:
[ -z 变量 ]:判断变量是否为空:
实践:
if [ -f file ] 判断是否为普通文件且存在:
[root@localhost_02 shell]# cat if5.sh #判断f是不是文件且存在,不存在则建立: #!/bin/bash f='/tmp/fenye' if [ -f $f ] then echo $f exist else touch $f fi [root@localhost_02 shell]# sh -x if5.sh #第一次运行时,不存在则建立: + f=/tmp/fenye + '[' -f /tmp/fenye ']' + touch /tmp/fenye [root@localhost_02 shell]# sh if5.sh #第二次运行时,提示文件已存在: /tmp/fenye exist
if [ -d file ] 判断是否为目录,且存在:
[root@localhost_02 shell]# cat if6.sh #!/bin/bash d='/tmp/fenye' if [ -d $d ] then echo $d exits; else mkdir $d fi [root@localhost_02 shell]# sh -x if6.sh + d=/tmp/fenye + '[' -d /tmp/fenye ']' + mkdir /tmp/fenye mkdir: 没法建立目录"/tmp/fenye": 文件已存在
注释:文件和文件均可以touch 的,touch的目的是若是这个文件或目录不存在,它会建立这个文件,若是这个文件或目录存在了,在touch 就会更改这个文件的三个 time:
if [ -e file] 判断文件或目录是否存在:
[root@localhost_02 shell]# cat if7.sh #!/bin/bash if [ -e /tmp/fenye ] then echo file is exist; else touch $d fi [root@localhost_02 shell]# sh if7.sh file is exist
if [ -r file ] 判断文件是否可读:
[root@localhost_02 shell]# cat if7.sh #!/bin/bash d='/tmp/fenye' if [ -r $d ] then echo file is read; fi [root@localhost_02 shell]# sh -x if7.sh + d=/tmp/fenye + '[' -r /tmp/fenye ']' + echo file is read file is read
if [ -w file ] 判断文件是否可写:
[root@localhost_02 shell]# cat if8.sh #!/bin/bash d='/tmp/fenye' if [ -w $d ] then echo file $d is writ; fi [root@localhost_02 shell]# sh -x if8.sh + d=/tmp/fenye + '[' -w /tmp/fenye ']' + echo file /tmp/fenye is writ file /tmp/fenye is writ
注释:经过去判断文件的可读可写,就能够判断当前执行shell脚本的是那个用户:
[root@localhost_02 shell]# cat if8.sh #!/bin/bash d='/tmp/fenye' if [ -x $d ] then echo file $d is writ; else echo file $d no exec; fi [root@localhost_02 shell]# sh -x if8.sh + d=/tmp/fenye + '[' -x /tmp/fenye ']' + echo file /tmp/fenye no exec file /tmp/fenye no exec
使用经常使用的: && 而且 或者 ||
[root@localhost_02 shell]# cat if9.sh #!/bin/bash f='/tmp/fenye' [ -f $f ] && rm -fr &f #前面的命令执行成功,才会执行后面的命令; 等同于下面的表达式: if [ -f $f ] then rm -fr $f; fi
[root@localhost_02 shell]# cat if10.sh #!/bin/bash f='/tmp/fenye' [ ! -f $f ] || touch $f #表示前面的命令执行不成功,才会执行后面的命令; 等同于下面的命令: if [ -f $f ] #表示第一条命令执行不成功,才会往下执行; then touch $f fi
if 判断的一些特殊用法:
if [ -z $a ] 表示当判断变量a的值为空时会怎么样:
if [ -n $a ] 表示当判断变量a的值不为空会怎么样:
if grep -q "123" passwd;then 表示判断passswd文本中含有123的行时会怎么样:
if [ ! -e file ] 表示文件不存在时则怎么样:
if (($a>5));then..... 等同于 if [ $a -gt 5 ];then .....
[ ]中不能使用<,>,==,!=,>=,<=这样的符合(须要结合两个圆括号使用):
实践:
注释: -z 或者 -n 不能做用在文件上,只能做用在变量上:两个正好相反:建议使用这两个参数时变量都加上双引号:
!-z === -n
!-n === -z
[root@localhost_02 shell]# cat if11.sh #!/bin/bash n=`wc -l /tmp/lala` if [ -z "$n" ] then echo error exit elif [ $n -gt 100 ] then echo abck fi [root@localhost_02 shell]# sh -x if11.sh ++ wc -l /tmp/lala wc: /tmp/lala: 没有那个文件或目录 + n= + '[' -z '' ']' + echo error error + exit
改良后:加入判断:
[root@localhost_02 shell]# cat if12.sh #!/bin/bash if [ -f tmp/lala ] then echo "The /tmp/lala not exits" exit fi n=`wc -l /tmp/lala` if [ -z "$n" ] then echo error exit elif [ $n -gt 100 ] then echo adbc fi [root@localhost_02 shell]# sh if12.sh wc: /tmp/lala: 没有那个文件或目录
[ -n $a ] 判断变量不为空时发生什么: 等同于 ! -z
注释:用 “-n”选项时,若是是变量时,则要用双引号引发了,若是是文件则不须要:(通常不能做用在文件上)
[root@localhost_02 shell]# a=1 [root@localhost_02 shell]# if [ -n "$a" ];then echo ok;else echo nook;fi #a声明了变量: ok [root@localhost_02 shell]# if [ -n "$b" ];then echo ok;else echo nook;fi #b没有声明变量: nook
3: 在逻辑判断中,有时候还可使用一个命令的结果做为判断条件:
判断某个文件中是否含有某个字符:(某个系统中是否含有某个用户):
grep -wq "zabbix" /etc/passwd
-w:后面跟单词,表示精确匹配后面的单词: -q:表示静默输出,仅仅过滤,不输出结果,通常用于脚本中:
[root@localhost_02 shell]# if grep -wq "zabbix" /etc/passwd;then echo zabbix exist;else echo zabbix not exist; fi zabbix exist
如上:判断zabbix用户是否存在:
也或者,有时想用户不存在,则建立这个用户,直接取反,以下:
[root@localhost_02 shell]# if ! grep -wq "fenye" /etc/passwd;then useradd fenye;else zabbix exits;fi [root@localhost_02 shell]# grep "fenye" /etc/passwd fenye:x:1002:1002::/home/fenye:/bin/bash
四、case判断:格式以下:
case 变量名 in value1) commond ;; value2) commond ;; *) commond ;; esac
注释:在case程序中,能够在条件中使用 | ,表示或的意思,好比:
‘2|3') commond ;;
shell脚本案例:输入成绩:
[root@localhost_02 shell]# vim case1.sh #!/bin/bash read -p "Please input number : " n if [ -z "$n" ] then echo "Please input number" exit 1 fi n1=`echo $n|sed 's/[0-9]//g'` if [ ! -z "$n1" ] then echo "Please input a muber" exit 1 fi if [ $n -le 60 ] && [ $n -gt 0 ] then tag=1 elif [ $n -le 80 ] && [ $n -gt 60 ] then tag=2 elif [ $n -le 90 ] && [ $n -gt 80 ] then tag=3 elif [ $n -le 100 ] && [ $n -gt 90 ] then tag=4 else tag=0 fi case $tag in 1) echo “不及格” ;; 2) echo "及格" ;; 3) echo "良好" ;; 4) echo "优秀" ;; *) echo "The is number range is 0-100" ;; esac [root@localhost_02 shell]# sh case1.sh Please input number : 50 “不及格” [root@localhost_02 shell]# sh case1.sh Please input number : 90 良好 [root@localhost_02 shell]# sh case1.sh Please input number : 101 The is number range is 0-100
注释:
shell 中 exit0 exit1 的区别: exit(0):正常运行程序并退出程序; exit(1):非正常运行致使退出程序; exit 0 能够告知你的程序的使用者:你的程序是正常结束的。若是 exit 非 0 值,那么你的程序的使用者一般会认为你的程序产生了一个错误。 在 shell 中调用完你的程序以后,用 echo $? 命令就能够看到你的程序的 exit 值。在 shell 脚本中,一般会根据上一个命令的 $? 值来进行一些流程控制;