频道栏目
首页 > 资讯 > 其他 > 正文

Shell脚本中的逻辑判断、if特殊用法、case判断和文件目录属性判断等知识讲解

18-07-18        来源:[db:作者]  
收藏   我要投稿

Shell脚本中的逻辑判断

在shell脚本当中很多地方都会用到逻辑判断,判断某一个数值,判断某个目录或文件,然后针对判断的结果再做一个操作,若没有判断,是无法进行一些操作的.

例如cp一些文件,或者MV,或是删除某个文件,没有判断,写这些命令就没什么意义,也就不叫作shell脚本,可见shell脚本非常重要.

shell当中常见的逻辑判断语法

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

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

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

-lt (小于)

-gt (大于)

-le (小于或等于)

-ge(大于或等于)

-eq(等于)

-ne(不等于)

&& 表示并且

|| 表示或者

#在命令行里也可以实现,不一定要写shell脚本才可以实现,只不过使用命令去实现需要使用分号.
[root@123 ~]# for i in `seq 1 5`; do echo $i; done
1
2
3
4
5


#不使用分号将会是这样的
[root@123 ~]# for i in `seq 1 5`
> do
> echo $i
> done
1
2
3
4
5

 


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

在命令行操作
[root@123 ~]# a=6

[root@quandong ~]# if [ $a -gt 3 ]; then echo ok; fi
ok


说明:方括号两边需要有空格,-gt 是大于, $a大于3,那么这肯定OK的.



在脚本里写,就整理一下格式即可,然后再执行
[root@123 sbin]# cat 04.sh 
#! /bin/bash
a=6
if [ $a -gt 3 ]
then 
    echo ok
fi

[root@123 sbin]# sh 04.sh 
ok

 


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

[root@123 sbin]# vim 05.sh 

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

[root@123 sbin]# sh -x 05.sh 
+ a=2
+ '[' 2 -gt 3 ']'
+ echo nook
nook


#如果$a 大于3,输出OK, 否则(else),输出nook

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

# 满足一个条件的情况
[root@123 sbin]# vim 06.sh

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


#执行过程
[root@123 sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 3 ']'
+ echo '>3'
>3


说明:如果$a 大于3,输出>3 ;又如果(elif)$a 小于8,输出<8 && >3
     那满足了第一个条件,$a 大于3,输出>3,后面的条件就不再执行了.
     elif 是可以使用多次的;
     lt 是小于



#所有条件都不满足的情况
[root@123 sbin]# vim 06.sh
#! /bin/bash
a=6
if [ $a -gt 7 ]
then
    echo ">7"
elif [ $a -lt 5 ]
then
    echo "<5 && >7"
else
   echo "nook"
fi


执行过程
[root@123 sbin]# sh -x 06.sh
+ '[' 6 -gt 7 ']'
+ '[' 6 -lt 5 ']'
+ echo nook
nook

说明:如果$a 大于7,输出>7,不满足,执行下一个条件,又如果$a 小于5,输出<5 && >7,都不满足,输出nook

文件目录属性判断

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

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

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

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

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

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

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

# 判断文件是否存在,若不存就创建
[root@123 sbin]# vim file1.sh
#! /bin/bash
f="/tmp/Annalinux"
if [ -f $f ]
then
    echo $f exist
else
    touch $f
fi


#执行过程
[root@123 sbin]# sh -x file1.sh
+ f=/tmp/Annalinux
+ '[' -f /tmp/Annalinux ']'
+ touch /tmp/Annalinux



说明:if [ -f $f ]  判断/tmp/Annalinux 是否存在,明显是不存在的,所有就touch 了这个文件


# 重新执行一次,判断文件是否存在,若存就输出结果
[root@123 sbin]# sh -x file1.sh
+ f=/tmp/Annalinux
+ '[' -f /tmp/Annalinux ']'
+ echo /tmp/Annalinux exist
/tmp/Annalinux exist

说明:前面不存在就touch了, 重新再执行一次肯定是存在的这个文件,那么判断输出是存在

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

# 判断目录是否存在,若不存在就创建
[root@123 sbin]# cat file2.sh 
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
    echo $d exist
else
    mkdir $d
fi

#执行过程
[root@123 sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ mkdir /tmp/Anna


说明:if [ -d $d ]  判断/tmp/Annalinux 是否存在,明显是不存在的,所有就mkdir 了这个文件



#重新执行一次,判断目录是否存在,若存在就输出
[root@123 sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist


说明:前面不存在就mkdir了, 重新再执行一次肯定是存在的这个文件,那么判断输出是存在

 


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

[root@123 sbin]# cat file2.sh 
#! /bin/bash
f="/tmp/Anna"
if [ -e $f ]
then
    echo $f exist
else
    mkdir $f
fi



#执行过程
[root@123 sbin]# sh -x file2.sh 
+ f=/tmp/Anna
+ '[' -e /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist


说明:-e 不管是文件或目录,是判断是否存在,不存在的话就touch

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

[root@123 sbin]# vim file2.sh 

#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
    echo $f readable
fi


#执行
[root@123 sbin]# sh file2.sh 
/tmp/Anna readable

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

[root@123 sbin]# vim file2.sh 

#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
    echo $f readable
fi



#执行
[root@123 sbin]# sh file2.sh 
/tmp/Anna writeable



说明:可写是针对当前root用户,若切换到quandong用户,那么就只有可读的权限,没有可读权限

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

[root@123 sbin]# vim file2.sh 

#! /bin/bash
f="/tmp/Anna"
if [ -x $f ]
then
    echo $f exeable
fi


#执行
[root@123 sbin]# sh file2.sh 
/tmp/Anna exeable


说明:可写是针对当前root用户,若切换到quandong用户,那么就只有可读的权限,没有可执行权限

判断一个目录是否存在,如果存在删除掉

[root@123 sbin]# vim file2.sh 

#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
   rmdir $d
fi



#执行
[root@123 sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ rmdir /tmp/Anna


#判断一个目录是否存在,如果存在就输出This is ok, 若不存在就创建
[root@123 sbin]# vim file2.sh 

#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
   echo "This is ok"  
else [ -d $d ]
   mkdir $d
fi


#执行
[root@123 sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo 'This is ok'
This is ok


20.7if特殊用法

if [ -z "$a" ] 表示当变量a 的值为空时会怎么样
if [ -n "$a" ] 表示当变量a的值不为空
if grep -q '123' 1.txt; then 表示如果1.txt中含有‘123’的行时会怎样
if [ ! -e file ]; then ... 表示文件不存在时会怎样
if (($a<1)); then .. 等同于 if [ $a -lt 1 ]; then...
[ ] 中不能使用 <,>, ==, !=,>=,<=这样的符号

 

if [ -n "$a" ] 表示当变量a的值不为空
if [ -z "$a" ] 表示当变量a 的值为空

if [ -n "$a" ] 表示当变量a的值不为空
[root@123 sbin]# if [ -n 09.sh ]; then echo ok; else echo "09.sh is null"; fi
ok


说明: 判断01.sh 是否为空,不为空 ,输出is ok 



# if [ -z "$a" ] 表示当变量a 的值为空 
[root@123 sbin]# if [ -z "$b" ]; then echo no null; fi
no null

说明:


     

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

[root@123 sbin]# vim file3.sh

#! /bin/bash
if [ ! -f /tmp/Annalinux ]
then
    echo "No such file or directory"
    exit
fi
if [ -f /tmp/Annalinux ]
then
    echo "This is file"
    exit
fi

[root@123 sbin]# sh -x file3.sh 
+ '[' '!' -f /tmp/Annalinux ']'
+ '[' -f /tmp/Annalinux ']'
+ echo 'This is file'
This is file
+ exit

说明: 先判断/tmp/Annalinux 文件是否存在,如果不存在,输出 No such file or directory。并退出
      如果存在,输出This is file,并退出.
       ! -F 表示不存在
       -f 表示存在
       ! -f  和 -f  意思相反

在逻辑判断中,还可以根据判断结果,作为判断结果

[root@123 sbin]# if grep -w 'apache' /etc/passwd; then echo "apache exist"; fi
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
apache exist
[root@quandong sbin]# if grep -wq 'apache' /etc/passwd; then echo "apache exist"; fi
apache exist



说明: 如果apache这个单词在/etc/passwd 这个文件存在,输出apache exist
      grep -w 选项表示匹配一个单词, -q不显示任何信息



[root@123 sbin]# if ! grep -w 'user1' /etc/passwd; then echo useradd user1; fi
useradd user1


说明:  if ! grep -w 'user1' 取反的意思,如果user1这个用户不存在,那么创建user1用户.

cace判断

case 逻辑判断

说明:这个脚本的目的是让用户输入一个数字,然后用这个脚本去判断用户输入的数字的一个范围

[root@123 sbin]# vim case.sh

#! /bin/bash
read -p " Please input a number: "n
if [ -z "$n" ]                         //判断 $n是否为空, 为空的话,说明用户没有输入数字
then 
     echo "Please input a number."     //那么就提示请输入数字
     exit 1                            //然后退出来,返回一个数值 1                
fi
n1=`echo $n |sed 's/[-0-9]//g'`        //判断输入的是否是纯数字,echo 出来后,做一个特殊操作,使用sed 把所有
                                         的数字 0-9 清空, $n1 这个变量就为空了
if [ ! -z $n1 ]                        // 当变量不为空时,说明输入的不是数字,不合法,则提示继续输入数字
                                          当变量为空时继续往下执行,说明输入的是数字
then
     echo "Please input a number."     //继续提示输入数字
     exit 1                            //继续退出来,返回一个数值 1
#elif [ $n -lt 0 ] || [ $n -gt 100 ]
#then 
#     echo "Then number range is 0-100."
#     exit 1
fi
if [ $n -lt 60 ]
then 
      tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then 
      tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then 
      tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
      tag=4
else
      tag=0
fi
case $tag in
        1)
        echo " 不及格"
        ;;
        2)
        echo "及格"
        ;;
        3)
        echo "良好"
        ;;
        4)
        echo "优秀"
        ;;
        *)
        echo "The number range is 0-100."
        ;;
esac




# read -p " Please input a number: "n
说明 n 作为捕获一个变量的名字,用户输入什么数字,那么这个n 就会赋值什么数字,这就是read -p 的作用

演示:
[root@123 sbin]# read -p " Please input a number: " n
 Please input a number: 100
[root@123 sbin]# echo $n
100

[root@123 sbin]# read -p " Please input a number: " n
 Please input a number: 800
[root@123 sbin]# echo $n
800


#执行,输入数字90
[root@123 sbin]# sh -x case.sh 
+ read -p ' Please input a number: ' n
 Please input a number: 90
+ '[' -z 90 ']'        //判断 90 变量是否存在
++ sed 's/[-0-9]//g'   // $n1 清空 
++ echo 90
+ n1=                  //$n1 为空
+ '[' '!' -z ']'       // 判断是否不为空,不为空说明正常,往下匹配
+ '[' 90 -lt 60 ']'
+ '[' 90 -ge 60 ']'
+ '[' 90 -lt 80 ']'
+ '[' 90 -ge 80 ']'
+ '[' 90 -lt 90 ']'
+ '[' 90 -ge 90 ']'
+ '[' 90 -le 100 ']'
+ tag=4               //匹配到了第4个条件
+ case $tag in
+ echo $'\344\274\230\347\247\200'
优秀



# 执行,输入非数字,就会提示请输入数字
[root@123 sbin]# sh -x case.sh 
+ read -p ' Please input a number: ' n
 Please input a number: gsagas
+ '[' -z gsagas ']'        //判断 gsagas 变量是否存在
++ sed 's/[-0-9]//g'       //清空$n1 所有数字
++ echo gsagas
+ n1=gsagas                //$n1不为空,所以输入的不是数字有问题
+ '[' '!' -z gsagas ']'
+ echo 'Please input a number.' 
Please input a number.       //提示请输入数字
+ exit 1


相关TAG标签
上一篇:Nginx结合Keepalived的双主模式实例讲解
下一篇:LINUX有哪些不必要的服务可以关闭?
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站