shell脚本编程和文件查找及压缩

shell脚本编程

read:使用read来把输入值分配一个或多个shell变量

    -p 指定要显示的提示

    -t TIMEOUT

    read 从标准输入中读取值,给每个单词分配一个变量

    所有剩余单词被分配给最后一个变量

    read -p "Enter a filename :" FILE

blob.png

条件选择if语句

注意:if语句可以嵌套

单分支

    if 判断语句;then

        条件为真的分支代码

    fi

  1 #!/bin/bash
  2 num1=10
  3 num2=15
  4 if  [[ $num1 -lt $num2 ]];then
  5         echo $num1
  6 fi
~

blob.png

双分支

    if判断条件;then

        条件为真的分支代码

    else

        条件为假的分支代码

    fi

  1 #!/bin/bash
  2 num1=20
  3 num2=9
  4 if  [[ $num1 -lt $num2 ]];then
  5     echo $num1
  6 else
  7     echo $num2
  8 fi

blob.png

多分支

    if判断条件1;then

        if-ture

    elif 判断条件2;then

        if-ture

    elif 判断条件3;then

        if-ture

        ….

    else

        all-false

    fi

注意:逐条件进行判断,第一次遇到为"真"条件时,执行其分支.而后结束整个if语句

  1 #!/bin/bash
  2 file=/etc/issue
  3 
  4 if [[ -d $file ]];then
  5     echo "the $file is a diretory"
  6 elif [[ -h $file ]];then
  7     echo "the $file is a sysmbol file"
  8 elif [[ -b $file ]];then
  9     echo "the $file is a block file"
 10 elif [[ -f $file ]];then
 11     echo "the $file is a common file"
 12 else
 13     echo "the $file is other file"
 14 fi

blob.png

条件判断:case语句

case 变量引用 in

pat1)

    分支1   

    ;;

pat2)

    分支2

    ;;

….

*)

    默认分支

    ;;

esac

case支持glob风格的通配符:

*:任意长度任意字符

?:任意单个字符

[]:指定范围内的任意单个字符

a|b:z或者b

  1 #!/bin/bash
  2 read -p "input a num:" num
  3 case $num in
  4 3|6|1)
  5     echo "madan"
  6     ;;
  7 2|0|4|5)
  8     echo "shabi"
  9     ;;
 10 7|8|9)
 11     echo "haha"
 12     ;;
 13 *)
 14     echo "why"
 15 esac
~

 blob.png

练习题

 1 、写一个脚本/root/bin/createuser.sh ,实现如下功能:

使用一个用户名做为参数,如果指定参数的用户存在,就显

示其存在,否则添加之;显示添加的用户的id 号等信息

  1 #!/bin/bash
  2 #author:qiuwei
  3 [[ $# -lt 1 ]]&&echo "please input at least one username"&&exit
  4 
  5 if id $* &>/dev/null;then
  6     echo "the user $* exist"
  7     
  8 else useradd $* &> /dev/null&&echo "the user $* create sucess" &&id $*
  9 fi

blob.png

 2 、写一个脚本/root/bin/yesorno.sh ,提示用户输入yes或 或

no, 并判断用户输入的是yes 还是no, 或是其它信息

方法一

此方法比较笨,如果组合的选项太多就不适用,

  1 #!/bin/bash
  2 read -p "please input yes or no :" num
  3 if [[ $num =~ ^[yY][Ee][sS]$ ]];then
  4     echo yes
  5 elif [[ $num =~ ^[Nn][oO]$ ]];then
  6     echo no
  7 else
  8     echo "please input correct info"
  9 fi

方法二

此方法就是将输入的字符全部转换为大写或者小写,

  1 #!/bin/bash
  2 read -p "please input yes or no:" num
  3 num1=`echo $num|tr "A-Z" "a-z"`
  4 if [[ $num1 =~ ^yes$ ]];then
  5     echo "yes"
  6 elif [[ $num1 =~ ^no$ ]];then
  7     echo "no"
  8 else
  9     echo "please input correct info"
 10 fi

blob.png

 3 、写一个脚本/root/bin/filetype.sh, 判断用户输入文件路

径,显示其文件类型(普通,目录,链接,其它文件类型)

  1 #!/bin/bash
  2 [[ $# -lt 1 ]]&&echo "please input at least one file"&&exit
  3 if   [[ -h $* ]];then
  4     echo "the $* is a sysmbol file"
  5 elif [[ -f $* ]];then
  6     echo "the $* is a common file"
  7 elif [[ -d $* ]];then
  8     echo "the $* is a directory "
  9 elif [[ -b $* ]];then
 10     echo "the $* is a block file"
 11 else
 12     echo "the $* is other file"
 13 fi

blob.png

 4 、写一个脚本/root/bin/checkint.sh, 判断用户输入的参数

是否为正整数

  1 #!/bin/bash
  2 read -p "please input a num:" num
  3 [[ -z $num ]]&&echo "please input one num"&&exit
  4 num1=`echo "$num"|egrep -o "\-?\<[[:digit:]]+\>"`
  5 if [[ $num == $num1 ]];then
  6     if [[ $num1 -lt 0 ]];then
  7         echo "the number is a  negative integer"
  8     elif [[ $num1 -eq 0 ]];then
  9         echo "the numbei is 0"
 10     else
 11         echo "the numbei is a  positive integer"
 12     fi
 13 else
 14     echo "the number is a non-integer"
 15 fi

blob.png

shell脚本编程总结:

    在shell脚本编程中if语句和case语句及其重要的,

case语句做条件判断,行尾必须为单词“in”,每一个模式必须以右括号“)”结束。

    双分号“;;”表示命令序列结束。

    case支持glob风格的通配符       

if语句作条件选择,有单分支双分支及多分支,if语句可嵌套使用

文件查找

locate:非实时查找(数据库查找)

查询系统上预建的文件索引数据库

    /var/lib/mlocate/mlocate.dbdb

索引的构建是在系统较为空闲时自动进行的(周期性任务),所以有的时候明明是有那个

文件但是不一定能查找得到,这时候需要手动更新数据库,命令为:updatedb

blob.png

索引构建过程需要遍历整个根文件系统,及其消耗资料

工作特点:

    1.查找速度快

    2.模糊查找

    3.非实时查找

    4.搜索的是文件的全路径,不仅仅是文件名

    5.可能只搜索用户具备读取和执行权限的目录

locate keyword

选项

    -i 忽略大小写

    -n N :只列举前n匹配项目

locate -r “\.shabi$”

使用扩展正则表达式来搜索以“.foo”结尾的文件

以下为搜索以bi结尾的文件

blob.png

find

实时查找工具,通过遍历指定路径完成文件查找

工作特点:

    1.查找速度略慢

    2.精确查找

    3.实时查找

    4.可能只搜索用户具备读取和执行权限的目录

语法:

    find [option0]…[查找路径][查找条件][处理动作]

        查找路径:指定具体目标路径;默认为当前目录

        查找条件:指定的查找标准,可以文件名,大小,类型,

权限等标准进行;默认为找出指定路径下的所有文件

        处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件


根据文件名和inode查找

-name “filename”:支持使用glob

        *,?,[],[^]

-iname “filename”:忽略大小写

blob.png

-inum n :按inode号查找

-samefile name :相同inode号的文件

blob.png

-links n 链接数为n的文件

blob.png

-regex “pattern”:以pattern匹配整个文件路径字符串,而不仅仅是文件名称

blob.png

根据属主,属组查找

    -user username:查找属主为指定用户(UID)的文件

    -group groupname :查找属主为指定组(GID)的文件

blob.png

    -uid  userid  :查找属组为指定的UID号的文件

    -gid  groupid :查找属组为指定的GID号的文件

blob.png

    -nouser  :查找没有属主的文件

    -nogroup :查找没有属组的文件

blob.png

根据文件类型查找

    -type TYPE:

    f :普通文件

    d :目录文件

    l :符号链接文件

    s :套接字文件

    b :块设备文件

    c :字符设备文件

    p :管道文件

blob.png

组合条件:

    与: -a

    或: -o

    非:-not ,!

德.摩根定律:

    (非p)或(非q)=非(p且q)

    (非p)且(非q)=非(p或q)

blob.png

blob.png

根据文件大小来查找:

-size [+|-]#UNIT

    常用单位:K,M,G

#UNIT:(#-1,#]

    如:6M表示(5M,6M]===>大于5M,小于等于6M

-#UNIT: [0,#-1]

    如:-6M表示[0,5M]===>大于等于0,小于等于5M

+#UNIT:(#,无穷大)

    如: +6M表示(6M,无穷大)===>大于6M

blob.png

根据时间戳:

以天为单位

    -atime [+|-]#,

    #:[#,#+1) 

      如:5,代表5天(包含第5天)到第6天前

    +#:[#+1,无穷大]

     如 +5,代表6天(包含第6天)到文件创建的这段时间

    -#:[0.#)

      如-5,代表5天内的文件

 -mtime 同上用法

 -ctime 同上用法

以分钟为单位

    -amin

    -mmin

    -cmin

blob.png

根据权限查找:

-perm [/|-]mode

    mode:精确权限匹配 .

        例如:-perm 222,表示文件权限正好为222的文件

    /mode:任何一类(u,g,o)对象的权限只要能一位匹配即可,

    或关系,+从centos7开始淘汰

    -mode:每一类对象都必须同时拥有指定权限,与关系

    0 表示不关注

    find -prem 755 会匹配权限模式恰好是755的文件

    只有当每个人都有写权限时,find -porm -222才会匹配

    只有当任意人有写权限时,find -prom +222就会匹配

    +或者/表示或关系

    – 表示与关系

    只有其他人(other)有写权限时,find -perm -002才会匹配

[root@localhost qiuwei]# ll
total 12
--w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa
-rwxr-xr-x 1 root root  0 Aug 16 09:39 aaa222aaa
--w--w--w- 2 1001 1001 49 Aug 10 12:58 file
--------w- 1 root root 57 Aug 10 12:57 file2
drwxrwxrwx 2 root root  6 Aug 16 10:13 test
[root@localhost qiuwei]# find -perm 222   ===>只会匹配为222的文件
./file
./aaa
[root@localhost qiuwei]# find -perm -222  ===>只要每个人都有写权限,其他权限不管有没,都可以匹配到
.
./file
./aaa
./test
[root@localhost qiuwei]# find -perm +222   ====>表示+在centos7上以淘汰,要使用/
find: warning: you are using `-perm +MODE'.  The interpretation of `-perm +omode' changed in findutils-4.5.11.  The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
./file
./aaa
[root@localhost qiuwei]# find -perm /222   ===>任何人只有有读权限,只要有一个人有读权限,不管其他人有什么权限,都可以匹配
.
./file2
./file
./aaa
./aaa222aaa
./test
[root@localhost qiuwei]# find -perm -002    ===>只要other有读权限,其他不做任何要求,都可以匹配到
.
./file2
./file
./aaa
./test
[root@localhost qiuwei]# find -perm 755    ====>只会匹配权限为755的文件
./aaa222aaa
[root@localhost qiuwei]# find -perm /755   ====>在o,g,u中的任意一位中的任意权限相同就都可以匹配上
.
./file
./aaa
./aaa222aaa
./test
[root@localhost qiuwei]# find -perm -755   ====>每个人都有至少有755的权限,才能被匹配上
.
./aaa222aaa
./test
[root@localhost qiuwei]#

处理动作

-print:默认的处理的动作,显示至屏幕

-ls:类似对找到的文件执行 “ls -l”

-delete:删除查找到的文件

-fls file:查找到的所有文件的长格式信息保存至指定文件中

[root@localhost qiuwei]# find -perm -755 -ls   ===>显示匹配道德文件的长格式信息
447840    0 drwxrwxrwx   3 root     test           87 Aug 16 14:55 .
447845    0 -rwxr-xr-x   1 root     root            0 Aug 16 09:39 ./aaa222aaa
68613053    0 drwxrwxrwx   2 root     root            6 Aug 16 10:13 ./test
[root@localhost qiuwei]# find -perm 755 -ls
447845    0 -rwxr-xr-x   1 root     root            0 Aug 16 09:39 ./aaa222aaa
[root@localhost qiuwei]# find -perm 755 -delete   ===>删除了匹配到文件,完全不提醒,慎用!!!
[root@localhost qiuwei]# ll
total 12
--w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa
-rwxrwx-w- 1 root root  0 Aug 16 14:54 bbbb
-r-------- 1 root root  0 Aug 16 14:55 ccc
--w--w--w- 2 1001 1001 49 Aug 10 12:58 file
--------w- 1 root root 57 Aug 10 12:57 file2
drwxrwxrwx 2 root root  6 Aug 16 10:13 test
[root@localhost qiuwei]# find -perm  222 -fls ddd  ==>将匹配的文件的长格式信息保存至ddd文件中
[root@localhost qiuwei]# ll
total 16
--w--w--w- 2 1001 1001  49 Aug 10 12:58 aaa
-rwxrwx-w- 1 root root   0 Aug 16 14:54 bbbb
-r-------- 1 root root   0 Aug 16 14:55 ccc
-rw-r--r-- 1 root root 147 Aug 16 15:13 ddd
--w--w--w- 2 1001 1001  49 Aug 10 12:58 file
--------w- 1 root root  57 Aug 10 12:57 file2
drwxrwxrwx 2 root root   6 Aug 16 10:13 test
[root@localhost qiuwei]# cat ddd
447872    4 --w--w--w-   2 1001     1001           49 Aug 10 12:58 ./file
447872    4 --w--w--w-   2 1001     1001           49 Aug 10 12:58 ./aaa

-ok command {}\;对查找到的每个文件执行有command指定的命令;

        执行命令之前,都会交互式要求用户确认

-exex command {}\;对查找到的每个文件执行有command指定的命令;

        直接执行命令,不会有交互式,所以要谨慎使用

find命令传递查找的文件至后面的命令时,是所有参数一次性传递的

但是有些命令接受参数的个数是有上限的,超过上限命令会失败,

可使用 find|xargs command

以下命令区别在于是否有交互式

blob.png

总结:

    find在整个磁盘上遍历整个文件系统查找文件

    查找路径

    查找条件:

        1.根据文件名和inode

        2.属主属组

        3.文件类型

        4.文件大小

        5.时间戳

        6.权限

        7.可根据德.摩根定律组合查找  

    处理动作

        可跟一些命令对查找出来的文件进行处理

练习

 1 、查找/var 目录下属主为root ,且属组为mail 的所有文件

指令

find /var -user root -group mail

blob.png

 2 、查找/var 目录下不属于root 、lp 、gdm 的所有文件

匹配到的文件挺多的,只选了两行

方法1

find /var -not \( -user root -o -user lp -o -user gdm \) -ls |head -2

方法2

-a选项是默认的

find /var -not -user root -not -user lp -not -user gdm  -ls |head -2

blob.png

 3 、查找/var 目录下最近一周内其内容修改过,同时属主不为

root ,也不是postfix 的文件

指令:

find /var -mtime -7 -not -user root -not -user postfix -ls |head -2

blob.png

 4 、查找当前系统上没有属主或属组,且最近一个周内曾被访

问过的文件

find / \( -nouser -o -nogroup \) -atime -7 -ls |head -2

blob.png

 5 、查找/etc 目录下大于1M 且类型为普通文件的所有文件

find -size +1M -type f -ls|head -3

blob.png

6 、查找/etc 目录下所有用户都没有写权限的文件

说明:

都没有写权限理解为u没有写权限且g没有写权限且o没有写权限

(u无w)且(g无w)且(o无w)

根据德.摩根定律,可替换成

无(u有w 或 g有w 或 o有w)

都没有写权限可以表示为 -not -prem /222  ===>/222表示的就是或关系

find /etc -not -perm /222 -ls |head -2

blob.png

 7 、查找/etc 目录下至少有一类用户没有执行权限的文件

说明:至少有一类用户没有执行权限的反义就是全部都有执行权限,

我们找出全部都有执行权限的然后取反就可以了

find -not -perm -111

find  -not -perm /100 -o -not -perm /010 -o -not -perm /001

blob.png

 8 、查找/etc/init.d 目录下,所有用户都有执行权限,且其它

用户有写权限的文件

说明:

find /etc/init.d  -perm -113 -ls  ===>查找init.d这个文件本身  错

find /etc/init.d/  -perm -113 -ls ===>进入init.d目录查找   对

blob.png

blob.png

排除 目录

示例:查找/etc/ 下,除/etc/sane.d 目录的其它所有.conf 后缀的文件

find /etc -path ‘/etc/sane.印,

如果-o前面的没有执行,就打印后面的,

这样就实现了排除

排除多个就在中间加上是那个 -o -path ‘/etc/sane.d’ -a -prune

压缩和解压缩

compress   [-dfvcVr] [-b maxbits] [file …]

    -d:解压缩

    -c:结果输出至标准输出,不删除原文件

    -v:显示过程

uncompress 解压缩

zcat

我的linux系统上没有安装此命令,安装也安装不上,所以就不演示了

gzip:

    -d 解压缩,相当于gunzip

    -c:将压缩或解压缩的结果输出至标准输出

    -#:1-9 指定压缩比,值越大压缩比越大

zcat:不显示解压缩的前提下查看文本文件内容

blob.png

备注:不能对硬链接文件进行压缩

blob.png

bzip2

    -k:keep 保留原文件

    -d:解压缩

    -#:1-9,压缩比,默认为6

bzcat:不显示解压缩的前提下查看文本文件的内容

blob.png

blob.png

xz

    -k:keep,保留原文件

    -d:解压缩

    -#:压缩比,默认为6

xzcat:不显示解压缩的前提下查看文本文件的内容

和上面用法一样,就是压缩比例不一样,这里就不做演示了

zip

打包压缩

    zip -r  “生成压缩文件(可不带后缀)" "要压缩目录"

blob.png

解包解压缩

    unzip  "压缩文件"

blob.png

压缩cat /root/qiuwei/test |zip test –  ==>这个-代表的是前面的输出

blob.png

解压缩unzip -p test.zip >shab

blob.png

原创文章,作者:qiuwei,如若转载,请注明出处:http://www.178linux.com/36051

(0)
qiuweiqiuwei
上一篇 2016-08-18
下一篇 2016-08-18

相关推荐

  • awk用法三

      6、结构化控制语句     6.1 if语句       格式:if(条件) {body} else {else body}         实例1:判断/etc/passwd文件中的UID如果大于500则显示为“common user”,否则显…

    Linux干货 2016-02-14
  • vsftpd虚拟用户搭建

    首选的FTP服务器搭建方式 安装vsftpd      yum install -y vsftpd      systemctl enable vsftpd     #设置开机启动      systemctl is-enabled vsf…

    Linux干货 2017-04-27
  • iptables/netfilter入门

      iptables是Linux中的重要组件,它是对报文进行过滤,在2001年的1月Linux 2.4内核发布以来,就已经是Linux的一部分了。     现在的iptbales已经成为了功能很大的防火墙,具备了专有的商业防火墙的大多数的功能了。 1、防火墙简介 2、iptables/netfilter简介 …

    Linux干货 2017-01-31
  • Linux grep与正则表达式浅析

    #Linux grep与正则表达式浅析 ##grep   grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 ###grep语法    &n…

    Linux干货 2017-04-06
  • linux入门基础命令总结

    命令基础

    2017-09-18
  • 国际标准OSI七层模型和事实标准TCP/IP四层模型

    我们知道,标准分为三种:国际标准、国家标准和事实标准。那我们学习的两个重要模型:OSI和TCP/IP模型分别属于国际标准和事实标准,接下来我们来总结一下两种模型的分层及功能还有异同: 一:国际标准OSI模型 OSI:(Open System Interconnect) 开放系统互连,总共分为七层,从下到上顺序为:物理层(physical)、数据链路层(dat…

    2017-09-02

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 12:16

    文章对当天的知识进行了完整的梳理与总结,对于脚本而言,我们需要记住的是其语法,而后多写,多看优秀的代码,对于find命令则要求我们熟练掌握了,因为这是在笔试中的一个重要考点。