一、条件选择
1、if:按条件执行脚本中的内容,可以使用嵌套结构,有单分支、双分支和多分支结构,每个条件中可以有不止一条语句,如果有多条语句,可以用and(-a)或or(-o)连接在一起,但不能使用&&或||:
if COMMANDS; then
COMMANDS;
[ elif COMMANDS; then
COMMANDS; ]
…
[ else COMMANDS; ]
fi
2、case:判断执行脚本中的内容,把变量中的内容与多个模板进行匹配,然后根据成功的模板决定执行的代码。case语句时由上到下执行,所以模板应该从特殊到普通,最后用*匹配其余没有匹配到的字符:
case WORD in
PATTERN [| PATTERN]…)
COMMANDS
;;
PATTERN [| PATTERN]…)
COMMANDS
;;
…
*)
默认分支
;;
esac
二、文件查找
1、locate:通过系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db查找文件,索引构建实在系统较为空闲时自动进行,管理员也可以手动更新数据库,索引构建过程需要遍历整个根文件系统,极消耗资源。
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能住搜索用户具备执行权限的目录
locate KEYWORD 搜索名称或路径带有段剑子的文件
-i 执行区分大小写的搜索
-n # 只列举前#个匹配项目
-r '\PATTERN' 搜索被正则表达式匹配到的文件
2、find:实时查找工具,通过遍历指定路径完成文件查找
工作特点:
查找速度略慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、 权限等标准进行;默认为找出指定路径下的所有文件
根据文件名和inode:
-name "文件名称":按文件名查找,支持通配符
-iname "文件名称":按文件名查找,不区分大小写
-inum n 按照inode号查找文件
-samefile FILENAME 查看inode号相同的文件
-links n 链接数为n的文件
-regex "PATTERN":以正则表达式匹配文件路径中字符串,不仅仅是文件名称
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
组合多个条件查找文件
-a 与
-o 或
-not,! 非
德·摩根定律:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根据文件大小查找
-size [+|-]#UNIT
常用单位:K,M,G
#UNIT:(#-1,#],如6k表示(5,6]k
-#UNIT:[0,#],如-6k表示[0,5]k
+#UNIT:(#,∞),如+6k表示(6,∞)k
根据文件权限查找
-perm[/|-] MODE
MODE 精确权限匹配
/MODE 任何一类对象的权限中只要能一位匹配即可,表示或(|)关系CentOS7把+淘汰
-MODE 每一类对象都必须同时又有指定权限,表示与关系(&)
0 表示不关注此位权限值
处理动作:对符合条件的文件做操作,默认输出至屏幕
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l”命令;
-delete:删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前都会交互式要求用户确认;
-exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND指定的命令
{}:用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合 条件的文件一次性传递给后面的命令有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题
find | xargs COMMAND
练习:
1、写一个脚本/root/bin/createuser.sh,实现如下功能: 使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
2、写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
3、写一个脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
4、写一个脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
1、查找/var目录下属主为root,且属组为mail的所有文件
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \) -ls
3、查找/var目录下最近一周内其内容修改过,同时属主不为 root,也不是postfix的文件
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
find / \( -nouser -o -nogroup \) -atime -7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件
find -size +1M -type f -ls
6、查找/etc目录下所有用户都没有写权限的文件
find /etc -not -perm /222
7、查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -not -perm -111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
原创文章,作者:zhanghuanyu,如若转载,请注明出处:http://www.178linux.com/36285