六十八、shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断

六十八、shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断

一、shell脚本中的逻辑判断

格式1:if 条件 ; then 语句; fi

格式2:if 条件; then 语句; else 语句; fi

格式3:if …; then … ;elif …; then …; else …; fi

if:如果。

then:然后。

-gt:大于。

-lt:小于。

-eq:等于。

-ne:不等于。noeq。

-ge:大于等于。

-le:小于等于。


格式1:如果满足条件a大于3,则输出ok。最常用。

# if [ $a -gt 3 ]; then echo ok; fi    //这是用一行命令表示下方脚本

#!/bin/bash
a=5
if [ $a -gt 3 ]
then
   echo ok
fi


# sh -x if1.sh        //执行过程:5和3比较,大于3,输出ok。
+ a=5
+ '[' 5 -gt 3 ']'
+ echo ok
ok


格式2:若不满足条件不大于3,则输出nook

#!/bin/bash
a=5
if [ $a -gt 3 ]
then
   echo ok
else
   echo nook
fi


# sh -x if2.sh 
+ a=2
+ '[' 2 -gt 3 ']'
+ echo nook
nook


格式3:不满足第一个条件,但是满足第二个条件。

#!/bin/bash
a=2
if [ $a -gt 4 ]
then
   echo ">1"
elif [ $a -lt 3 ]
then
   echo "<3 && >4"
else
   echo nook
fi


# sh -x if3.sh 
+ a=2
+ '[' 2 -gt 4 ']'
+ '[' 2 -lt 3 ']'
+ echo '<3 && >4'
<3 && >4



逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到处都是空格

可以使用 && ,|| 结合多个条件。

&&:并且。

||:或者。

if [ $a -gt 5 ] && [ $a -lt 10 ]; then

if [ $b -gt 5 ] || [ $b -lt 3 ]; then


二、文件目录属性判断

[ -f file ]判断是否是普通文件,是否存在

[ -d file ] 判断是否是目录,是否存在

[ -e file ] 判断文件或目录是否存在

[ -r file ] 判断文件是否可读

[ -w file ] 判断文件是否可写

[ -x file ] 判断文件是否可执行

#!/bin/bash
f="/tmp/aminglinux"
if [ -f $f ]
then
    echo $f exist
else
    touch $f
fi


# sh -x  file.sh    //第一次判断,没有这个文件,会创建这个文件

+ f=/tmp/aminglinux
+ '[' -f /tmp/aminglinux ']'
+ touch /tmp/aminglinux


# sh -x  file.sh        //第二次判断,有这个文件,直接输出这个文件

+ f=/tmp/aminglinux
+ '[' -f /tmp/aminglinux ']'
+ echo /tmp/aminglinux exist
/tmp/aminglinux exist


#!/bin/bash
f="/tmp/aminglinux"
[ -f /tmp/aminglinux ] && rm -f $f
判断前面的文件是否存在,如果存在,就删除它。
if [ -f $f ]
then
rm -f $f
fi

[ -f /tmp/aminglinux ] && rm -f $f  //这一句等于上面四句。

[ -f $f ]  || touch $f    //当前面的命令执行不成功时,才执行后面的命令。等同于下面的四句。! -f 取反。当这个文件不存在,就touch。

if [ ! -f $f ]

then

touch $f

fi


三、if特殊用法

if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样

if [ -n "$a" ] 表示当变量a的值不为空,不为空,条件成立。

! -z = -n

! -n = -z       它们的关系是相对的

使用-z和-n判断时,变量用双引号括起来,文件就不用。

使用该用法时,后面就不要用elif了,没有意义,应该用else。

#!/bin/bash
n='/tmp/lala'
if [ -z "$n" ]
then
echo no
exit
else
echo "12345" >> "/tmp/lala"
fi

如果用elif像下面这样写,就不对,因为前面是文件,后面用elif就只能和数字对比做判断,因为文件和数字不能对比,所以会报错,直接用else,然后touch文件或者追加什么的:

# if [ -n /tmp/lala ];then echo okk; fi

#!/bin/bash
n='/tmp/lala'
if [ -z "$n" ]
then
echo no
exit
elif [ $n -gt 10 ]
then
echo yes
fi


if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样

-w:更加精准的匹配。

-q:过滤,但是不把过滤的内容显示出来。

# if grep -wq 'user1' /etc/passwd; then echo "user1 exist"; fi

if [ ! -e file ]; then 表示文件不存在时会怎么样

!:取反,感叹号。

if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…

[ ] 中不能使用<,>,==,!=,>=,<=这样的符号


四、case判断

格式 case  变量名($a) in                    

                       value1)    

                            command       

                            ;;       

                        value2)    

                             command            

                             ;; 

                         *)    

                            commond         

                              ;;          

                           esac

在case程序中,可以在条件中使用|,表示或的意思, 比如    

             value2|value3)    

                   command   

                   ;;

每个判断里面以双分号结束,代表判断结束,进入下一个判断。

1.png

当执行status时,会执行它下面的语句,当执行restart或者reload或者force-reload时,会执行它下面的语句,当执行其他的命令时,执行“*”下面的语句。

# read -p "Please input a number: " n     read -p作用:比如给n赋值,输入什么就是什么。

Please input a number: 12345

# echo $n

12345

shell脚本案例:

#!/bin/bash
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "Please input a number."
exit 1     //退出来,返回一个数值
fi
n1=`echo $n|sed 's/[0-9]//g'`        判断输入的变量是不是纯数字
if [ -n "$n1" ]
then
echo "Please input a number."      输入一个纯数字
exit 1                                              再退出来
fi
if [ $n -lt 60 ] && [ $n -ge 0 ]           $n小于60并且大于等于0
then
tag=1        先用tag=1做标记
elif [ $n -ge 60 ] && [ $n -lt 80 ]          $n大于60小于80用tag=2标记
then
tag=2
elif [ $n -ge 80 ]  && [ $n -lt 90 ]          $n大于等于80并且小于90用tag=3标记
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]        $n大于等于90并且小于等于100用tag=4表示
then
tag=4
else                 不是这些情况的tag=0
tag=0
fi
case $tag in
1)
echo "not ok"
;;
2)
echo "ok"
;;
3)
echo "ook"
;;
4)
echo "oook"
;;
*)
echo "The number range is 0-100."
;;
esac


测试1:

# sh -x case.sh
+ read -p 'Please input a number: ' n
Please input a number: 101
+ '[' -z 101 ']'        //先判断这个变量是不是存在
++ echo 101
++ sed 's/[0-9]//g'            //存在之后,做一个判断,把数字清空,然后n1为空
+ n1=
+ '[' -n '' ']'                         //判断它是否不为空,不为空就正常,然后往下走,一个个比对判断。
+ '[' 101 -lt 60 ']'
+ '[' 101 -ge 60 ']'
+ '[' 101 -lt 80 ']'
+ '[' 101 -ge 80 ']'
+ '[' 101 -lt 90 ']'
+ '[' 101 -ge 90 ']'
+ '[' 101 -le 100 ']'
+ tag=0                         //所有条件都不满足,最后tag=0
+ case $tag in                //tag=0没有在1234里面的时候,就返回*号的输出。
+ echo 'The number range is 0-100.'
The number range is 0-100.

测试2:

# sh -x case.sh
+ read -p 'Please input a number: ' n
Please input a number: 65
+ '[' -z 65 ']'
++ echo 65
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 65 -lt 60 ']'
+ '[' 65 -ge 60 ']'
+ '[' 65 -lt 80 ']'
+ tag=2
+ case $tag in                   //大于60并且小于80,直接判定tag=2
+ echo ok
ok


猜你喜欢

转载自blog.51cto.com/13576245/2124287
今日推荐