shell中的if else语句与文件查找find浅析

shell中的if else语句与文件查找find浅析


   上篇文章中我们讲述了shell脚本编程的初步入门,其中讲到了shell编程中的顺序执行,顺序执行时一种简单的小脚本,如果在编辑脚本的时候遇到要做出条件判断执行的时候要怎么办呢?我们学习过if之后你会发现这会很简单。if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。

Shell 有三种 if … else 语句:

   if … fi 语句;

   if … else … fi 语句;

   if … elif … else … fi 语句。

1) if … else 语句

   if … else 语句的语法:

if [ expression ]
then
   Statement(s) to be executed if expression is true
fi

如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。

最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。

注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

示例:

[root@centos7 ~]# ./test.sh 
a is not equal to b
[root@centos7 ~]# cat test.sh 
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
   echo "a is equal to b"
fi
if [ $a != $b ]
then
   echo "a is not equal to b"
fi

2) if … else … fi 语句

   if … else … fi 语句的语法:

if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi

如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。

示例:

[root@centos7 ~]# ./test1.sh 
a is not equal to b
[root@centos7 ~]# cat test1.sh 
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
   echo "a is equal to b"
else
   echo "a is not equal to b"
fi

3) if … elif … fi 语句

   if … elif … fi 语句可以对多个条件进行判断,语法为:

if [ expression 1 ]
then
   Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
   Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
   Statement(s) to be executed if expression 3 is true
else
   Statement(s) to be executed if no expression is true
fi

哪一个 expression 的值为 true,就执行哪个 expression 后面的语句;如果都为 false,那么不执行任何语句。

示例:

[root@centos7 ~]# cat test2.sh 
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
   echo "a is equal to b"
elif [ $a -gt $b ]
then
   echo "a is greater than b"
elif [ $a -lt $b ]
then
   echo "a is less than b"
else
   echo "None of the condition met"
fi
[root@centos7 ~]# chmod +x test2.sh 
[root@centos7 ~]# ./test2.sh 
a is less than b

read:

在脚本编程中使用read命令来接受输入,read从标准输入中读取值,给每个单词分配一个变量,使用read来把输入值分配给一个或多个shell变量

   -p 指定要显示的提示

   -t TIMEOUT

   read -p “Enter a filename: “ FILE

示例:

[root@centos7 bin]# cat creatuser.sh 
#!/bin/bash
read -p "请出入一个用户名:" username
if id $username &> /dev/null; then
     echo "用户$username 存在"
     getent passwd $username
else 
     echo "用户不存在"
     echo "创建$username 用户"
     useradd $username 
     echo "用户$username 创建成功"
     id $username
fi
[root@centos7 bin]# ./creatuser.sh 
请出入一个用户名:zanghl
用户不存在
创建zanghl 用户
用户zanghl 创建成功
uid=1003(zanghl) gid=1003(zanghl) groups=1003(zanghl)

这里运行脚本后显示出:“请出入一个用户名:” 用户手动输入一个用户名。

case esac语句:

case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac

case工作方式如上所示。取值后面必须为关键字in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

[root@centos7 bin]# cat yesorno.sh 
#!/bin/bash
read -p "请输入 yes or no:" yn
case $yn in
[yY][eE][sS]|[yY])
echo "yes is write"
;;
[nN][oO]|[nN])
echo "no is write"
;;
*)
echo "input error"
;;
esac
[root@centos7 bin]# ./yesorno.sh
请输入 yes or no:yEs
yes is write
[root@centos7 bin]# ./yesorno.sh
请输入 yes or no:n
no is write

find:

   每一种操作系统都有许多的文件组成,对于linux这样“一切皆文件”的操作系统来说更是如此,大家应该都能很轻松使用windows下的文件查找功能,但是对linux这一功能可能并不是很熟悉,linux不像windows那样有固定的文件名后缀,并且因为linux阵营下百家争鸣的特性,一个相同的文件在不同的发行版,可能会有不同,所以如果你能牢牢掌握find命令的使用,你在摸索linux的道路上将会顺利很多。同时你会发现linux下文件查找功能其实很简单,而且要比windows下查找功能强大很多很多。

语法:

   find [OPTION]… [查找路径] [查找条件] [处理动作]

      查找路径:指定具体目标路径;默认为当前目录

      查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

      处理动作:对符合条件的文件做操作,默认输出至屏幕

根据文件名和inode查找:

     -name "文件名称":支持使用glob *, ?, [], [^]

     -iname "文件名称":不区分字母大小写

     -inum n  按inode号查找

     -samefile name 相同inode号的文件

     -links n 链接数为n的文件

     -regex "PATTERN":以PATTERN匹配整个文件路径字 符串,而不仅仅是文件名称

根据属主、属组查找:

     -user USERNAME:查找属主为指定用户(UID)的文件

     -group GRPNAME: 查找属组为指定组(GID)的文件

     -uid UserID:查找属主为指定的UID号的文件

     -gid GroupID:查找属组为指定的GID号的文件

     -nouser:查找没有属主的文件

     -nogroup:查找没有属组的文件

组合条件:

     与:-a

     或:-o

     非:-not, !

德·摩根定律:

    非(P 且 Q) = (非 P) 或 (非 Q)

    非(P 或 Q) = (非 P) 且 (非 Q)

    !A -a !B = !(A -o B)

    !A -o !B = !(A -a B)

查找条件:

    -perm [/|-]MODE

       MODE: 精确权限匹配

       /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘

       -MODE:每一类对象都必须同时拥有指定权限,与关系 0 表示不关注

       find -perm 755 会匹配权限模式恰好是755的文件

下面我们看一下下面这些示例:

这些示例能带给你对find的深刻理解

1、查找/var目录下属主为root,且属组为mail的所有文件

   find /var -user root -group mail

2、查找/var目录下不属于root、lp、gdm的所有文件

   find /var -not \( -user root -o -user lp -o -user gdm \) -ls

   find /var -not -user root -not -user lp -not -user gdm

这里的两个命令是一样的,根据德·摩根定律:非(P 或 Q) = (非 P) 且 (非 Q);

第二行的命令 -not -user root 与后面的 -not -user lp 中间连接的是 -a 只是默认没有写而已;

3、查找/var目录下最近一周内其内容修改过,同时属主不为 root,也不是postfix的文件

   find /var -mtime -7 -a -not \( -user root -o -user postfix \)

4、查找当前系统上没有属主或属组,且最近一个周内曾被访 问过的文件

   find / \( -nouser -o -nogroup \) -a -atime -7 

5、查找/etc目录下大于1M且类型为普通文件的所有文件

   find /etc -size +1M -a -type f

6、查找/etc目录下所有用户都没有写权限的文件

   find /etc ! -perm /222 -ls

7、查找/etc目录下至少有一类用户没有执行权限的文件

   find /etc ! -perm -111

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它 用户有写权限的文件

   find /etc/init.d/ -perm -111 -perm /002

原创文章,作者:zanghonglei,如若转载,请注明出处:http://www.178linux.com/36341

(5)
zanghongleizanghonglei
上一篇 2016-08-16
下一篇 2016-08-16

相关推荐

  • sed vim小练

     1 、删除/etc/grub2.conf 文件中所有以空白开头的行行首的空白字符  2 、删除/etc/fstab文件中所有以#开头,后面至少跟一个空 白字符的行的行首的#和空白字符 3 、在/root/install.log 每一行行首增加# [root@localhost ~]# sed -n&nbsp…

    Linux干货 2016-08-12
  • 实现CA和证书申请,

    接下来讲的是在centos7.3和centos6.8中实现CA和证书申请,centos7.3作为主机,centos6.8作为客户端 首先你授权客户端CA证书,必须本身主机也具有CA,自己证明自己,先CA自签证书,然后在7.3创建私钥 为了方便以后的操作CD进入 cd /etc/pki/CA   生成自签名证书 -new:  生成…

    2017-04-11
  • linux —————-目录配配置【FHS】

    linux 目录配配置【FHS】 /根目录的意义与内容 根目录是整个系统最重要的一个目录;根目录与开机、还原、系统修复等操作有关 FHS建议标准: 根目录所在的分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好 FHS定义的目录含义 /bin :系统存放执行文件的目录,但是bin比较特殊【bin放置的是在单用户维护模…

    Linux干货 2017-04-17
  • linux中扩展swap分区和移动设备使用挂载以及常用的工具free、df 、du、dd命令

    swap分区 swap分区作用:内存不足时充当系统内存,所以swap尽量放在告诉硬盘上也就是尽量使用磁盘的第一个分区 动手创建swap分区       1、创建分区,将分区类型转换成swap分区格式           &nbsp…

    Linux干货 2016-08-29
  • 马哥教育21期网络班—第9周课程+练习—-成长进行时–不退步

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash  declare -i other=0 declare -i nologin=0   &nbs…

    Linux干货 2016-09-05
  • N22-第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。      2、编辑/etc/group文件,添加组hadoop。 3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为…

    Linux干货 2016-09-05

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-18 17:08

    结构框架清晰,层次分明,对当天学到的东西,总结的很详细,详略得当,可以把操作的执行结果放上来,这样会更好哦。