2016-08-12
授课内容:
shell的流程控制
文件查找和压缩
shell的流程控制:
过程式编程语言:
顺序执行
选择执行
循环执行(未讲)
顺序执行:
if语句:
单分支
if 判断条件; then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if CONDITION1; then
if-true
elifCONDITION2; then
if-ture
elifCONDITION3; then
if-ture
...
else
all-false
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
注意,当then与if一行时,需要用;隔开,另起一行,则不需要添加;
例子:
[root@Centos7 shells]# cat createuser.sh #!/bin/bash #Version:1.0 #Create time:2016-08-12 11:09:20 #Description:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息 read -p "please input a username: " USERNAME #`id $USERNAM` &> /dev/null if id $USERNAME &> /dev/null ; then echo "the user exist" exit 100 else useradd $USERNAME &> /dev/null echo "the user add sucessfully and its info is:`id $USERNAME`" exit 99 fi unset USERNAME
选择执行:
case语句
case 变量引用 in
PART1)
COMMAND
;;
PART2)
COMMAND
;;
*) #其他情况
COMMAND
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
例子:
[root@Centos7 shells]# cat yesorno.sh #!/bin/bash #Version:1.0 #Create time:2016-08-12 11:24:09 #Description:写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息 read -p "please input yes or no: " STRING case $STRING in 'yes'|'y'|'Y'|'YES') echo "your answer is yes" exit 100 ;; 'no'|'n'|'N'|'no'|'n0') echo "your answer is no" exit 99 ;; *) echo "your answer is other" exit 98 esac unset STRING
文件查找:
locate、find(注意,grep和sed是文本(文件内容)查找工具,不是文件查找)
两者的区别:locate是非实时查找(依赖于事先构建的数据库索引),find是实时的遍历查找
locate:
locate [OPTION]... PATTERN...
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
依赖于事先构建的索引;
索引的构建是在系统较为空闲时自动进行(周期性任务);管理员手动更新数据库(updatedb);
索引构建过程需要遍历整个根文件系统,极消耗资源;
工作特点:
查找速度快;
模糊查找;
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
find:实时的遍历查找
find [OPTION]... [查找路径] [查找条件] [处理动作]
[查找路径]:指定具体目标路径;默认为当前目录
[查找条件]:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
[处理动作]:对符合条件的文件做操作,默认输出至屏幕
查找条件:
1、文件名和inode号
-name “filename” 支持使用glob *, ?, [], [^]
-iname “filename” 忽略文件名大小写
-inum 按照inode号来查找
-samefile “filenam” 相同inode号的文件
-links n :查找链接数为n的文件
-regex “PATTERN”:以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
2、根据属主、属组查找:
-user “username”
-group “groupname”
-uid “uid”
-gid “gid”
-nouser:查找没有属主的文件,指的是用户已删除,但其文件还没有删除
-nogroup:
3、根据文件类型查找:
-type
f:普通文件
d:目录文件
b:
c:
p:
s:
l:
4、根据文件大小来查找:【理解数值的范围】
-size [+|-]#size
常用单位:k, M, G
#UNIT: (#-1, #],如:6k
-#UNIT:[0,#-1], 如:-6k
+#UNIT:(#,∞), 如:+6k
5、按照文件的时间戳查找:【理解数值的范围】
以“天”为单位;
-atime[+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
6、根据权限查找:
-perm [/|-]mode
-perm 664:精确查找文件权限为664的文件
-perm /664:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,【即属主6,属组6,其他4,只要满足任意一个即可】
-perm -664:每一类对象都必须同时拥有指定权限,与关系,0 表示不关注,【即属主拥有6,属组拥有6,其他拥有4,必须满足三个】
动作处理:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件;
-flsfile:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题
find | xargs COMMAND
组合条件:
与:-a
或:-o
非:-not, !
德·摩根定律:
非(P 且Q) = (非P) 或(非Q)
非(P 或Q) = (非P) 且(非Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
文件压缩:
目的:压缩后的文件大小会减少,减少磁盘空间支出
大致原理:如文本love,会标记为一个字符记号,这样就可以大大缩减了文件大小,所以压缩对纯文本会特别明显
压缩格式:
.Z .gz .bz2 .xz
以上的压缩工具只对单个文件进行压缩,不能对整个目录进行压缩
压缩工具:
1、compress(其压缩文件后缀是.Z,默认压缩后删除原文件)
compress [-dfvcVr] [-b maxbits] [file ...]
-d:解压缩,相当于uncompress
-c:结果输出至标准输出,不删除原文件
uncompress:解压缩
由于此压缩工具压缩效果不理想,已被淘汰
2、gzip(其压缩文件后缀是.gz,默认压缩后删除原文件)
gzip [OPTION]... FILE ...
-d:解压,相当于gunzip
-c:结果输出至标准输出,不删除原文件
gunzip:解压缩
zcat file..:再不解压原文件的情况下临时查看压缩文件的内容
3、bzip2(其压缩文件后缀是.bz2,默认压缩后删除原文件)
bzip2 [OPTION]... FILE ...
-d:解压,相当于bunzip2
-c:结果输出至标准输出,不删除原文件
-k:保留原文件
bunzip2:解压缩
bzcat:不显式解压缩的前提下查看文本文件内容
4、xz(其压缩文件后缀是.xz,默认压缩后删除原文件)
-d:解压,相当于unxz
-c:结果输出至标准输出,不删除原文件
-k:保留原文件
xzcat:不显式解压缩的前提下查看文本文件内容
归档(打包)工具tar:
tar [options] [新的打包文件名] [需要打包的文件...]
-c:创建归档文件
-f “filename”:打包的文件名前必须要加-f参数
-z:以gzip方式压缩归档文件
-x:展开归档文件
-t:不解归档的情况下查看归档的文件列表
-zcf: 归档并调用gzip压缩
-zxf: 调用gzip解压缩并展开归档,-z选项可省略
-jcf: 归档并调用bzip2压缩
-jxf:调用bzip2解压缩并展开归档,-j选项可省略
-Jcf: 归档并调用xz压缩
-Jxf:调用xz解压缩并展开归档,-J选项可省略