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,到后面会有更加详细的描述。