bash shell脚本编程入门篇(二)
read命令的使用
作用:
使用read来把输入值分配给一个或多个shell变量:
-p指定要显示的提示
-t TIMEOUT
read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量
EX.read -p “Enter a filename:“ FILE
条件选择之if的使用
if的作用:选择执行(注意:if语句可嵌套)
单分支
if 判断条件;then
条件为真的分支代码
fi
EX.单分支案例
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
EX.双分支并嵌套if语句的例子
多分支
if 判断条件1; then
if-true
elif 判断条件2; then
if-ture
elif 判断条件3; then
if-ture
...
else
all-false
fi
EX.多分支案例
总结:if的使用,是逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
条件选择之case的使用
case语句语法格式:
case 表达式 in
模式1)
条件1
;;
模式2)
条件2
;;
模式n)
条件n
;;
*)
剩余条件
;;
esac
case中各模式可以使用glob匹配模式:
a|b:a或者b
*:匹配任意长度的任意字符
?:匹配任意单个字符
[ ]:范围匹配
EX.case的使用案例
文件查找的使用
文件查找作用:在文件系统上查找符合条件的文件;
文件查找相关命令:locate, find
非实时查找(数据库查找):locate
实时查找:find
locate命令的使用
1.locate命令特点:
(1)查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
(2)依赖于事先构建的索引
(3)索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)
(4)索引构建过程需要遍历整个根文件系统,极消耗系统IO资源
(5)工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
2.locate相关命令:
locate KEYWORD
(1)选项:
-i 执行区分大小写的搜索
-n N只列举前N个匹配项目
-r 支持使用正则表达式
(2)模糊搜索
locate "png" ;搜索含有jpg字眼的文件
(3)支持正则表达式
locate -r '\.png$' 使用regex来搜索以.jpg结尾的文件
EX.使用locate搜索以.png结尾的文件,不区分png的大小写,且只显示前10行搜索出来的内容。
EX.由于locate搜索的内容依赖于/var/lib/mlocate/mlocate.db里面的内容,所以如果数据块里面没有这个内容的话就搜索不到这个内容了。甚至有时候有些数据块里面有的内容也搜不出来。
小总结:在生产环境中,如果使用locate命令搜索不到的想要内容,也不要用updatedb命令更新数据库,因为可能要更新的数据有很多,这样的话会造成系统会产生大量的IO,会造成系统严重卡顿。
find命令的使用
1.find命令的特点:
(1)实时查找工具,通过遍历指定路径完成文件查找;(普通用户需要注意权限问题)
(2)查找速度略慢
(3)精确查找
(4)可能只搜索用户具备读取和执行权限的目录
2.find命令的语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
3.find命令的查找条件
(1)根据文件名和inode查找:
-name "文件名称":支持使用glob
*, ?, [], [^]
-iname"文件名称":不区分字母大小写
-inumn 按inode号查找
-samefilename 相同inode号的文件
-links n 链接数为n的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
EX.直接匹配目录下面的以s开头,以.sh结尾的文件
EX.匹配目录下面以s开头,以d.sh结尾的文件,并且忽略大小写
EX.匹配/testdir/shells下面以s开头,以.sh结尾的文件
(2)根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uidUserID:查找属主为指定的UID号的文件
-gidGroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
EX.查找/testdir/shells/下面属主为w,属组为wan的文件
(3)根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
EX.查找/testdir/shells/下面的目录文件
(4)组合条件:
与:-a (默认情况下面已经是-a,例如 -user A -group A跟-user A -a -group A是一个意思)
或:-o
非:-not, !
EX.查找属组为w或者属组为w的文件,注意,用-o的时候,前后都需要加一个-ls.否则,只显示后者(即-group w的-ls的结果)
(5)德·摩根定律:
( 非 P ) 或 ( 非 Q ) = 非 ( P 且 Q )
( 非 P ) 且 ( 非 Q ) = 非 ( P 或 Q )
EX.查找属主和属组都不是root的文件
(6)根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
EX.查找/testdir/shells/目录下文件大于1k的文件
EX.查找/testdir/shells/目录下文件大于1k的文件,并且排除bierendesh这个目录
(7)根据时间戳:
以“天”为单位;
-atime[+|-]# 访问时间
#: [#,#+1) 无符号:表示短于(#+1)>x>=#天的时间段被访问过
+#: [#+1,∞] 表示(#+1)天之外被访问过
-#: [0,#) 表示#天内被访问过的
-mtime 修改时间
-ctime 改变时间
以“分钟”为单位:
-amin
-mmin
-cmin
EX.找出~/bin目录下面两天内修改过的文件并且按照提示删除
EX.找出~/bin目录下面两天内修改过的文件并且直接删除
(8)根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
EX.精确查找权限为644的文件
EX.查找u,g,o组都至少有读和执行权限的文件
EX.查找u,g,o其中一个有读写权限的文件和目录
4.find命令的处理动作:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件;
-flsfile:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题
find | xargsCOMMAND
EX.处理动作示例
(1)删除符合u=读,或g=任意,或o=任意的文件
EX.把搜索出来的结果存档到一个指定的文件
EX.搜索指定文件并且对符合条件的文件执行指定命令,-ok是会询问,换成-exec则直接执行
小总结:find命令相当强大,但是各种参数也是很多的,需要查找时间的关系,还有权限/和-符号代表的意义。以及不要搞混乱德·摩根定律。
压缩、解压缩工具及归档工具
compress/uncompress 命令的使用
compress [-dfvcVr] [-b maxbits] [file ...]
-d: 解压缩,相当于 uncompress
-c: 结果输出至标准输出,不删除原文件
-v: 显示详情
uncompress解压缩
zcat file.Z>file 能查看压缩文档并且重定向到指定文件,相当于~解压缩..到~
EX.compress示例
gzip/gunzip 命令的使用
gzip[OPTION]... FILE ...
-d: 解压缩,相当于gunzip
-c: 将压缩或解压缩的结果输出至标准输出
-#:1-9,指定压缩比,值越大压缩比越大
zcat:不显式解压缩的前提下查看文本文件内容
EX.示例
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
EX.通过重定向解压了并保持原文件的案例
bzip2/bunzip2/bzcat 命令的使用
bzip2 [OPTION]... FILE ...
-k: keep, 保留原文件
-d:解压缩
-#:1-9,压缩比,默认为6
bzcat:不显式解压缩的前提下查看文本文件内容
EX.用bzip2压缩文件并且保留原文件的示例
xz/unxz/xzcat 命令的使用
xz[OPTION]... FILE ...
-k: keep, 保留原文件
-d:解压缩
-#:1-9,压缩比,默认为6
xzcat: 不显式解压缩的前提下查看文本文件内容
zip/unzip 命令的使用
打包压缩目录
zip –r 指定压缩文件 压缩目录
解包解压缩
unzip sysconfig.zip
这个命令最大的亮点是可以压缩目录,其他命令暂时都不支持压缩目录。
示例:
cat /var/log/messages | zip message -
unzip -p message > message
EX.压缩目录,需要注意输入命令时候的压缩文件和目录位置
EX.解压目录到指定路径
tar 命令的使用
tar [OPTION]...打包,并不压缩文件。(此命令需要自行添加后缀名,否则有可能不能识别)
-cf打包文件,并不压缩
-v 能看见过程
-t 预览tar包里面的文件
-xvf解压tar包,默认解压到当前目录
-C 指定解压路径
-zcvf 打包并且压缩成*.tar.gz
-z gz方式压缩
-Jxz方式压缩
-j bz2方式压缩
(1) 创建归档
tar -c -f /PATH/TO/SOMEFILE.tar FILE...
tar -zcvf /PATH/TO/SOMEFILE.tar FILE...
(2) 查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(3) 展开归档
tar -x -f /PATH/TO/SOMEFILE.tar (解压到当前目录)
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/ (解压到指定目录)
cpio 命令的使用
复制从或到文件
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件。
cpio[选项] > 文件名或者设备名
cpio[选项] < 文件名或者设备名
[option]选项
-o 将文件拷贝打包成文件或者将文件输出到设备上
-i解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称。
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式
将etc目录备份:
find ./etc -print |cpio -ov >etc.cpio
内容预览
cpio–tv< etc.cpio
要解包文件
cpio–iv <etc.cpio
cpio–idv< etc.cpio
小结:压缩和归档软件,用得最多的还是gzip和tar,还有cpio,到后面会有更加详细的描述。