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选项可省略