温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

条件判断之if、case语句和文件查找命令

发布时间:2020-07-04 10:08:53 来源:网络 阅读:1079 作者:nieda_linux 栏目:数据库

一、脚本编程

1、if语句怎样用

人生面临许多选择,在编程世界里同样也有许多选择。同其他编程语言一样,当我们想写一个功能健壮的脚本时,通过条件判断来选择适合的操作尤为重要。在我们执行某些重要的操作之前,判断当前环境是否适合执行这一操作是非常重要的。我们可以用&&和||来做简单的判断,不过shell有更用的语句。shell有两种常见的条件选择语句if和case。我们先来看一下if该怎样用吧。

if语句的单分支语法:

if 条件判断 ;then;执行命令;fi

[root@localhost ~]# type if
if is a shell keyword
[root@localhost ~]# type fi
fi is a shell keyword
[root@localhost ~]# type then
then is a shell keyword

首先可以看到,if、fi和then在shell中都是关键词

双分支:

if 条件判断 ;then
    执行代码
else
    执行代码
fi
多分支:
if 条件判断;then
    执行代码
elif 条件判断;then
    执行代码
elif 条件判断;then
    执行代码
.........
else
    执行代码
fi

if语句逐一判断,当遇到条件为真时则执行该条件下的分支命令,而后结束整个if语句

当然,if语句本身很简单的,但使用if语句必须要熟练掌握条件测试语句,并且当if语句和其他语句嵌套使用时必须要理清逻辑关系否则将很难排错。


2、shell的case语句

当我们要判断的条件是连续的逻辑关系时可以很方便的使用if来操作,但是如果是离散关系时,if语句将会显得臃肿而繁琐,这时使用case语句将非常高效。在Linux中特别是写一些服务的启动脚本时将会遇到很多的case语句,掌握case语句是做运维,至少是脚本开发要掌握的一个基本知识。

和if语句不同,case语句的逻辑关系更加清晰

case 变量引用 in
pat1)
    分支1
    ;;
pat2)
    分支2
    ;;
.........
*)
    最后的分支
    ;;
esac

case支持通配符,如*,?,[],|等

注意最后要写esac,将case倒转和if相同,如果不写将报错


二、文件查找

1、loacte通过名字查找文件

locate通过updatedb库来查找文件,默认使用包含通配符的pattern,如果没用通配符默认匹配全路径包括路径名。如果刚创建的文件没有同步到数据库中locate命令将无法查找。

locate默认的查找库是/var/lib/mlocate/mlocate.db,系统设置默认计划执行数据库的同步任务,当整个文件系统很复杂且变化很大时时同步任务将会耗费大量的系统资源。

locate的特点:

  • 查找速度块

  • 模糊查找

  • 非实时查找

  • 只搜索用户具备读取和执行权限的目录

整个locate工作其实是由四部分组成的:
/usr/bin/updatedb       主要用来更新数据库,这个工作是通过crontab自动完成的。
/usr/bin/locate(mlocate)   是作来完成查询功能的程序。
/etc/updatedb.conff   是配置要查询哪些目录、哪些文件。
/var/lib/mlocate/mlocate.db   存放文件信息的文件。


locate命令的选项:

-A:--all 后面有多个模式,只打印符合所有匹配模式的文件

-b:--basename 只匹配基名符合pattern的文件,和--wholename的用法相反

-c:--count 只显示匹配到的文件的数量,不显示匹配到的文件

-d:--database 使用指定的搜索数据库替换默认的,-表示从标准输入读取库

-e:--existing 只显示当locate运行时已存在的文件

-L:--follow 当文件存在时跟随蔓延的符号链接(默认) 

-i:--ignore-case 匹配模式时忽略大小写区别

-l:--limit -n LIMIT限制为LIMIT项目的输出(或计数)   

-m:--mmap 忽略向后兼容性

-P:--nofollow, -H当检查文件时不跟随蔓延的符号链接  

-0:--null 输出时以NUL分隔项目 

-S:--statistics 不搜索项目,显示有关每个已用数据库的统计信息

-q:--quiet 不报告关于读取数据库的错误消息

-r:--regexp REGEXP搜索基本正则表达式REGEXP来代替glob模式  

--regex 模式是扩展正则表达式

-s:--stdio 忽略向后兼容性

-w:--wholename 匹配完整路径名(默认) 


二、find实时查找工具,通过遍历指定路径完成文件查找

查找特点:

查找速度慢

精确查找

实时查找

只查找用户有相应权限的目录

语法:find [options] [查找起始路径] [查找条件] [处理动作]

查找条件:选项+测试条件

条件测试:结果通常是布尔型

组合测试:

与:-a 或:-o 非:-no或!

德·摩根定律:

!(-pat1 -o -pat2) = ! -pat1 -a ! -pat2

条件判断之if、case语句和文件查找命令

!(pat1 -a pat2) = ! pat1 -o ! pat2

条件判断之if、case语句和文件查找命令

  • 根据文件名判断

-name pattern,通配符匹配,精确匹配,pattern要加引号

-iname 不区分大小写

-inum 查找所有分区某个inode号的所有文件

-samefile 查找inode相同的文件

[root@localhost ~]# find / -samefile test.sh
find: ‘/proc/3732/task/3732/fd/7’: No such file or directory
find: ‘/proc/3732/task/3732/fdinfo/7’: No such file or directory
find: ‘/proc/3732/fd/7’: No such file or directory
find: ‘/proc/3732/fdinfo/7’: No such file or directory
/root/test.sh
/opt/t

注意:find只找磁盘文件,对于/proc里的内存文件无法查找

-links n 链接数为n的文件或目录

-regex 匹配整个路径而不是基名,所以正则模式要把完整的目录路径也包括进去。find默认使用的是emacs正则,如果要换其他的正则可以用-regextype选项来指定

  • 根据文件的从属关系

-user username 查找某个用户的所有文件

-group groupname 查找某个组所有的文件

-uid 根据uid来查找

-gid 根据gid来查找

-nouser 查找没有属主的文件

-nogroup 查找没有属组的文件

注意:Linux使用id来标识文件的从属关系

  • 根据文件类型查找

-type 后面接文件的类型,注意文件和目录包括符号链接,所以判断时最好将符号连接写在前面

  • 根据文件大小查找:

-size [+|-]#UNIT 常用单位:K、M、G默认为字节

注意:只有字节为单位才能够精确超找,如果以其他单位找,在两个相邻整数间的数一律看作大的那一个

#UNIT:(#-1,#]

-#UNIT:[0,#-1]

+#UNIT:(#,)

条件判断之if、case语句和文件查找命令

  • 根据时间查找

根据时间查找有两个单位,且他们的计算方法是不一样的

1、以天为单位

-atime [+|-]#

-mtime

-ctime

条件判断之if、case语句和文件查找命令

2、以分钟为单位

-amin [+|-]#

-mmin

-cmin

条件判断之if、case语句和文件查找命令

当#为1时,mmin 1和mmin -1的区域将会重叠

  • 根据权限查找:

-perm:[/|-]mode 数字

mode 精确匹配权限

/mode 任何一类用户的任何一位权限符合条件即可

-mode 所有用户每一位权限都必须符合

注意:/000和-000一样,0表示不关心权限

  • 处理动作

-print:输出到stdout,默认打印

-ls:显示文件的长格式信息

-delete 删除查找的文件

-fls /PATH 将查找的文件保存到指定文件

-ok command {} \;将查找的文件执行command命令,{}代表查找到的文件,但每操作一个文件都会有提示。

-exec command {} \;没有提示,其中\;代表结束

注意:-ok和-exec是将find找到的所有文件一个一个的处理,即给每一个文件执行一次命令,我们知道一个命令就是一个进程,当找到的文件有很多时,将会消耗较多的资源并导致效率的下降,为了避免这个问题可以用xargs

find 查找条件 |xargs command

xargs是将find找到的所有结果当成一个参数传给command,即command只执行了一次,效率更高。但是 由于将所有的结果用一个空格隔开然后变成一个变量的模式,当遇到查找到的文件名中有空格将会出错

  • 排除目录:

-path PATH -prune 组合排除,并且的关系

[root@localhost ~]# find /etc -path '/etc/sane.d' -prune -o -name "*.conf"
/etc/resolv.conf
/etc/fonts/conf.d/65-0-lohit-marathi.conf
/etc/fonts/conf.d/59-liberation-mono.conf
/etc/fonts/conf.d/67-lohit-malayalam.conf
/etc/fonts/conf.d/59-liberation-sans.conf
/etc/fonts/conf.d/65-0-lohit-punjabi.conf
/etc/fonts/conf.d/10-scale-bitmap-fonts.conf
/etc/fonts/conf.d/60-open-sans.conf
/etc/fonts/conf.d/20-unhint-small-vera.conf
/etc/fonts/conf.d/65-0-madan.conf
/etc/fonts/conf.d/25-no-bitmap-fedora.conf
/etc/fonts/conf.d/66-ucs-miscfixed.conf
......


练习

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

[root@localhost ~]# find /var/ -user root -group mail -ls
201327104    0 drwxrwxr-x   2 root     mail           50 Aug 14 10:37 /var/spool/mail
206330921    8 -rw-------   1 root     mail         4219 Aug 14 10:37 /var/spool/mail/root

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

[root@localhost ~]# find /var/ ! \( -user root -o -user lp -o -user gdm \) -ls
135969642    0 drwxr-xr-x   3 colord   colord         50 Aug  2 21:22 /var/lib/colord
203103112    0 drwxr-xr-x   2 colord   colord          6 Nov 20  2015 /var/lib/colord/icc
139609985    4 -rw-r--r--   1 colord   colord       4096 Aug  2 21:22 /var/lib/colord/mapping.db
139609986    8 -rw-r--r--   1 colord   colord       7168 Aug  2 21:22 /var/lib/colord/storage.db
68217670    0 drwx------   2 tss      tss             6 Nov 21  2015 /var/lib/tpm
135970004    0 drwxr-xr-x   2 unbound  unbound        21 Aug  3 06:10 /var/lib/unbound
135970006    4 -rw-r--r--   1 unbound  unbound       409 Nov 20  2015 /var/lib/unbound/root.key
204613039    0 drwxr-x--x   7 qemu     qemu           69 Aug  2 21:18 /var/lib/libvirt/qemu
 10634    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/save
70295736    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/snapshot
139609974    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/dump
206290799    0 drwxr-xr-x   3 qemu     qemu           19 Aug  2 21:18 /var/lib/libvirt/qemu/channel
 10635    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/channel/target
.........

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

[root@localhost ~]# find /var/ -mtime -7 -not \( -user root -o -user postfix \) -ls
67136164    4 -rw-------   1 setroubleshoot setroubleshoot     3286 Aug 10 22:34 /var/lib/setroubleshoot/setroubleshoot_database.xml
1485002    0 drwxrwx--T   6 gdm      gdm            79 Aug 10 22:33 /var/lib/gdm
136239626    4 -rw-r--r--   1 gdm      gdm            43 Aug 10 22:33 /var/lib/gdm/.pulse/9987c5b50f134797b202165f43b10443-default-sink
136239627    4 -rw-r--r--   1 gdm      gdm            42 Aug 10 22:33 /var/lib/gdm/.pulse/9987c5b50f134797b202165f43b10443-default-source
 10663    4 -rw-------   1 gdm      gdm           930 Aug 10 22:33 /var/lib/gdm/.ICEauthority
.........

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

[root@localhost ~]# find / -atime -7 \( -nouser -o -nogroup \) -ls
find: ‘/proc/2924/task/2924/fd/6’: No such file or directory
find: ‘/proc/2924/task/2924/fdinfo/6’: No such file or directory
find: ‘/proc/2924/fd/6’: No such file or directory
find: ‘/proc/2924/fdinfo/6’: No such file or directory
139610001    0 drwx------   2 1000     1000            6 Aug  2 21:26 /tmp/.esd-1000
 10683    0 drwxr-xr-x   2 1000     1000            6 Aug  2 21:26 /tmp/hsperfdata_nieda
 10680    0 drwx------   2 1000     1000            6 Aug  2 21:26 /tmp/tracker-extract-files.1000
 10648    4 drwx------  14 1000     1000         4096 Aug  2 21:26 /home/nieda
67136350    0 drwxr-xr-x   4 1000     1000           37 Aug  3 06:08 /home/nieda/.mozilla
139173477    0 drwxr-xr-x   2 1000     1000            6 Jun 10  2014 /home/nieda/.mozilla/extensions
203103518    0 drwxr-xr-x   2 1000     1000  
.........

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

[root@localhost ~]# find /etc/ -size -1M -type f |xargs ls -lh
-rw-r--r--. 1 root root 0 Sep 10  2011 /etc/akonadi/mysql-local.conf
-rw-------. 1 root root 0 Jul 27  2015 /etc/cron.deny
-rw-------. 1 root root 0 Aug  3 06:08 /etc/crypttab
-rw-------. 1 root lp   0 Nov 20  2015 /etc/cups/classes.conf
-rw-r--r--. 1 root lp   0 Nov 20  2015 /etc/cups/client.conf
-rw-r--r--. 1 root lp   0 Nov 20  2015 /etc/cups/lpoptions
-rw-------. 1 root lp   0 Nov 20  2015 /etc/cups/printers.conf
-rw-r--r--. 1 root root 0 Aug 12  2015 /etc/environment
-rw-r--r--. 1 root root 0 Jun  7  2013 /etc/exports
-rw-r--r--. 1 root root 0 Mar  6  2015 /etc/ghostscript/9.07/cidfmap.local
-rw-r--r--. 1 root root 0 Mar  6  2015 /etc/ghostscript/9.07/CIDFnmap.local
-rw-r--r--. 1 root root 0 Mar  6  2015 /etc/ghostscript/9.07/Fontmap.local
-rw-r--r--. 1 root root 0 Jun  7  2013 /etc/motd
-rw-------. 1 root root 0 Aug  3 06:10 /etc/.pwd.lock
-rw-r--r--. 1 root root 0 Nov 20  2015 /etc/qemu-kvm/target-x86_64.conf
-rw-r--r--. 1 root root 0 Nov 20  2015 /etc/security/console.apps/xserver
-rw-------. 1 root root 0 Aug 18  2015 /etc/security/opasswd
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/contexts/files/file_contexts.local
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/contexts/files/file_contexts.subs
-rw-------. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/modules/active/netfilter_contexts
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/modules/semanage.read.LOCK
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/modules/semanage.trans.LOCK
-rw-r--r--. 1 root root 0 Jun 10  2014 /etc/sysconfig/run-parts
-rw-r--r--. 1 root root 0 Jun 10  2014 /etc/wvdial.conf

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

[root@localhost ~]# find /etc/ -not -perm /222 -ls
134499699  196 -r--r--r--   1 root     root       198453 Aug  3 06:09 /etc/pki/ca-trust/extracted/java/cacerts
201850195  352 -r--r--r--   1 root     root       359773 Aug  3 06:09 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
330861  264 -r--r--r--   1 root     root       266702 Aug  3 06:09 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
330862  216 -r--r--r--   1 root     root       217510 Aug  3 06:09 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
330863  208 -r--r--r--   1 root     root       211626 Aug  3 06:09 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
625260    4 -r--------   1 root     root           45 Aug  3 06:09 /etc/openldap/certs/password
136242234    4 ----------   1 root     root          785 Aug 16  2016 /etc/gshadow
134317908    4 ----------   1 root     root          795 Aug 13 18:26 /etc/gshadow-
134317916    4 ----------   1 root     root         1303 Aug 16  2016 /etc/shadow-
136242221    4 ----------   1 root     root         1183 Aug 16  2016 /etc/shadow
1058222    4 -r--r--r--   1 root     root          531 Sep  6  2015 /etc/lvm/profile/cache-mq.profile
1058223    4 -r--r--r--   1 root     root          338 Sep  6  2015 /etc/lvm/profile/cache-smq.profile
1058224    4 -r--r--r--   1 root     root         2249 Nov 21  2015 /etc/lvm/profile/command_profile_template.profile
1058225    4 -r--r--r--   1 root     root          828 Nov 21  2015 /etc/lvm/profile/metadata_profile_template.profile
1058226    4 -r--r--r--   1 root     root           76 Sep  6  2015 /etc/lvm/profile/thin-generic.profile
1058227    4 -r--r--r--   1 root     root           80 Sep  6  2015 /etc/lvm/profile/thin-performance.profile
136009869    4 -r--r--r--   1 root     root          460 Nov 20  2015 /etc/dbus-1/system.d/cups.conf
1788506    4 -r--r--r--   1 root     root           63 Nov 20  2015 /etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf
139173483 6852 -r--r--r--   1 root     root      7014922 Aug  3 06:18 /etc/udev/hwdb.bin
135840874    4 -r--r--r--   1 root     root           33 Aug  3 06:10 /etc/machine-id
1058267    4 -r--r--r--   1 root     root          146 Nov 20  2015 /etc/pam.d/cups
139259112    8 -r--r-----   1 root     root         4188 Jul  7  2015 /etc/sudoers

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

[root@localhost etc]# find /etc/ -not -perm -111 -ls

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

[root@localhost etc]# find /etc/init.d -perm -113 -ls
134370978    0 lrwxrwxrwx   1 root     root           11 Aug  3 06:08 /etc/init.d -> rc.d/init.d
[root@localhost etc]# ls /etc/init.d/ -l
total 32
-rw-r--r--. 1 root root 13948 Sep 16  2015 functions
-rwxr-xr-x. 1 root root  2989 Sep 16  2015 netconsole
-rwxr-xrwx. 1 root root  6630 Sep 16  2015 network
-rw-r--r--. 1 root root  1160 Nov 20  2015 README
[root@localhost etc]# find /etc/init.d/ -perm -113 -ls
203103221    8 -rwxr-xrwx   1 root     root         6630 Sep 16  2015 /etc/init.d/network

注意:查找目录下的文件时,在目录的后面必须要加上/,否则将查看目录本身



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI