20.5 shell脚本中的逻辑判断
20.6 if判断文件目录属性
20.7 if判断特殊用法
20.8/20.9 case判断
20.5 shell脚本中的逻辑判断:
在shell脚本里,-gt为大于,-lt为小于,-eq为等于,-ne为不等于,-ge为大于等于,
-le为小于等于
~1.格式1:if 条件 ; then 语句; fi
#最常见的格式,if(如果怎么怎么样)...;then(然后怎么怎么样)...;fi(与前面的if相对应的)
[root@axinlinux-01 shell]# a=5 #假如a=5
[root@axinlinux-01 shell]# if [ $a -gt 3 ] #命令行下可以分开这样写。假如a大于3的时候
> then #然后
> echo ok #输出ok
> fi #fi 表示结束
ok #回车后就是ok。因为我们假如a=5了,已经满足上面条件了
[root@axinlinux-01 shell]# if [ $a -gt 3 ]; then echo ok; fi #写完上面的,按上一条命令就显示这个。这就是一整条命令行的写法,输出为ok
ok
#! /bin/bash #在脚本里可以这样写
a=1
if [ $a -gt 3 ]
then
echo ok
fi
~2.格式2:if 条件; then 语句; else 语句; fi
#if(如果怎么样);then(然后怎么样);else(不满足if的判断,怎么样);fi
#! /bin/bash
a=1
if [ $a -gt 3 ]
then
echo ok
else #如果不满足if的逻辑判断,怎么样
echo no #不满足就输出no
fi
~3.格式3:if …; then … ;elif …; then …; else …; fi
#elif 表示在满足if的基础之上,elif还满足什么什么。也就是又加了一个条件判断。可以写多次
#! /bin/bash
a=5
if [ $a -gt 10 ] #假如a大于10,然后输出>10
then
echo ">10"
elif [ $a -lt 4 ] #假如a小于4,然后输出>10 $$ <4
then
echo "<10 && >4"
else #以上都不满足,就输出no
echo no
fi
以上很明显都不满足,就输出no
~4.逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到处都是空格
如果我们就想用<>来表示大于或小于,可以这样写:
[root@axinlinux-01 shell]# a=3
[root@axinlinux-01 shell]# if ((a<5)) ; then echo ok ; fi #就是用两个括号括起来
ok
~5.可以使用 && || 结合多个条件
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
#并且关系的时候可以用&&来表示
if [ $b -gt 5 ] || [ $b -lt 3 ]; then
#或者关系的时候可以用||来表示
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.6 if判断文件目录属性:
~1.[ -f file ]判断是否是普通文件,且存在
#! /bin/bash
f=/tmp/axin
if [ -f $f ] #判断$f是否是文件
then #是的话,输出 $f exist
echo $f exist
else #不是的话,touch$f
touch $f
if
~2.[ -d file ] 判断是否是目录,且存在
#! /bin/bash
f=/tmp/axin
if [ -d $f ] #判断$f是否为目录
then #是的话echo $f exist
echo $f exist
else #不是的话mkdir $f
touch $f #不管是文件还是目录都是可以touch的。如果存在的话touch就会改变他的time
fi
~3.[ -e file ] 判断文件或目录是否存在
~4.[ -r file ] 判断文件是否可读
~5.[ -w file ] 判断文件是否可写
~6.[ -x file ] 判断文件是否可执行
实例:
通常我们会用到
#! /bin/bash
f=/tmp/axin
[ -f $f ] && rm-rf $f #这一行的效果等同于下面四行的效果(前面的执行成功才执行后面的)
if [-f $f]
then
rm-rf $f
fi
[ -f $f ] || touch $f #这一行的效果等同于下面四行的效果(前面的执行不成功才执行后面的)
if [ ! -f $f] #方括号里加!代表去反的意思
then
touch $f
fi
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.7 if判断的特殊用法:
~1.if [ -z "$a" ] 这个表示当变量a的值为空时会怎么样
#如果是变量要用双引号。如果是文件就不用双引号
~2.if [ -n "$a" ] 表示当变量a的值不为空
#如果是变量要用双引号。如果是文件就不用双引号
~3.if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行时会怎么样
#-q只做过滤,不显示结果
[root@axinlinux-01 shell]# if grep -wq 'user1' /etc/passwd; then echo "yes"; else echo "no"; fi
no
~4.if [ ! -e file ]; then 表示文件不存在时会怎么样
#-e为是否存在,加上!代表取反,为不存在
~5.if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…
#要想使用大于等于这样的字符,要加上双括号
~6.[ ] 中不能使用<,>,==,!=,>=,<=这样的符号
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.8/20.9 case判断:
~1.格式
case 变量名 in #比如case $a in
value1) #当值为1的时候怎么样
command
;; #双分号表示上面的判断结束进入下面的判断
value2)
command
;;
*) #除此之外又怎么样
command
;;
esac
~2.在case程序中,可以在条件中使用|,表示或的意思, 比如
2|3)
command
;;
~3.脚本案例
需求:当我们输入一个数字(0-100),判断这个同学的分数是什么样的级别(优秀、及格或不及格)
#!/bin/bash
read -p "Please input a number: " n #作为与用户交互,用户输入什么,那么那就是什么。首先我们要捕获这个数字。也同样定义了n这个变量
if [ -z "$n" ] #这个变量为空的时候。也就是用户没有输入的时候
then
echo "Please input a number." #没有输入直接回车了,就输出“请输入一个数字”
exit 1 #然后退出。这个1表示我们echo $?的值。就是说当客户为空直接回车,再使用echo $?的时候就会显示1
fi
n1=`echo $n|sed 's/[0-9]//g'` #ni=用户输入的匹配出除了数字的东西。假如用户输入了99ww,那么匹配出99,就过滤出了ww
if [ -n "$n1" ] #如果不为空怎么怎么样。(不为空的话肯定是带有非法字符啊,因为上一条已经过滤出除数字的了,依上一条就会显示ww)
then
echo "Please input a number." #如果出现除数字的字符,就显示“请输入数字”
exit 1
fi #这一段的意思是过滤数除数字的字符,并显示“Please input a number."
if [ $n -lt 60 ] && [ $n -ge 0 ] #输入的数字小于60并且大于等于0的时候
then
tag=1 #tag1为一个变量,下面我们会用case来定义它
elif [ $n -ge 60 ] && [ $n -lt 80 ] #输入的数字大于等于60并且小于80的时候
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ] #输入的数字大于等于80并且小于90的时候
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ] #输入的数字大于等于90并且小于100的时候
then
tag=4
else #以上都不满足的时候
tag=0
fi
case $tag in #我们来定义tag的值
1) #当tag的值为1的时候,显示"not ok"
echo "not ok"
;;
2) #当tag的值为2的时候,显示"ok"
echo "ok"
;;
3) #当tag的值为3的时候,显示"ok ok"
echo "ok ok"
;;
4) #当tag的值为1的时候,显示"ok ok ok"
echo "ok ok ok"
;;
*) #除此之外的。就是当tag都不符合1 2 3 4 的时候。就是上面定义的tag=0
echo "The number range is 0-100." #接上条,显示"The number range is 0-100."
;;
esac