一、shell脚本编程

  1. 编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果 指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息。

    #!/bin/bash
    #This script is used to determine whether the user exists or not.
    id $1 &> /dev/null;
    if [ $? = 0 ];then
        echo "user $1 is exist.";
    else
        useradd $1;
        echo "user $1 is created.";
        id $1;
    fi
    

  2. 编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等。

    set expandtab
    set tabstop=4
    set noai
    autocmd BufNewFile *.sh exec ":call Format()"
    func Format()
        call setline(1,"#!/bin/bash")
        call setline(2,"#***********************************")
        call setline(3,"#Author:               liuyi")
        call setline(4,"#Telephone:                 ")
        call setline(5,"#Version:                   ")
        call setline(6,"#Create_time:          ".strftime("%Y-%m-%d")."")
        call setline(7,"#Description:               ")
        call setline(8,"#***********************************")
    endfunc
    autocmd BufNewFile * normal G
    

    将以上内容保存至~/.vimrc文件中,使配置永久生效。此时用vim命令新建一个以.sh结尾的脚本文件时就会自动生成相应的格式。效果如图。

二、文件查找工具和打包压缩工具

文件查找工具

  1. locate

    格式:locate [OPTION]... [PATTERN]...
    
    选项 说明
    -i 不区分大小写搜索
    -n # 只列举前#个匹配项目
    -r 使用基本正则表达式
    --regex 使用扩展正则表达式
    -b 只匹配基名,默认匹配全路径
    -c 显示匹配文件的数量

    locate命令基于/var/lib/mlocate/mlocate.db这个目录索引文件来进行文件查找的,系统最小化安装是没有这个文件的。创建此文件有两种方法:第一种是过一段时间后系统会自动生成此文件;第二种是使用updatedb命令手动创建(此命令也可用于手动更新mlocate.db文件)。

  2. find

    格式:find [OPTION]...[查找路径][查找条件][处理动作]
    

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

    查找条件:指定查找标准,可以是文件名、大小、类型、权限等标准,默认为找出指定路径下的所有文件

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

    2.1 指定搜索目录层级

    -maxdepth level 最大搜索目录深度,指定目录下的文件为第一级
    -mindepth level 最小搜索目录深度
    

    2.2 对目录先处理目录内的文件,再处理目录本身

    -depth -d
    

    2.3 组合条件

    与:-a,默认多个条件是与关系
    或:-o,
    非:-not  !
    

    2.4 排除目录

    -path '目录名' -a -prune	可以排除指定目录
    查找/etc/下,除/etc/sane.d/目录的其他文件
    find /etc -path '/etc/sane.d' -a -prune
    排除/proc和/sys目录
    find / \(-path '/proc' -o -path '/sys'\) -a -prune
    

    2.5 查找空文件和目录

    -empty
    

    2.6 根据文件信息查找

    根据文件名和inode查找
    -name "文件名称"	支持使用glob通配符
    -iname "文件名称"	不区分字母大小写
    -inum n            按inode号查找
    -samefile name     相同inode号的文件
    -links n		   链接数为n的文件
    -regex "PATTERN"   以PATTERN匹配整个文件路径,而非文件名称
    
    根据属主、属组查找
    -user USERNAME     查找属主为指定用户的文件
    -group GROUPNAME   查找属组为指定组的文件
    -uid USERID		   查找属主为指定UID的文件
    -gid GROUPID       查找属组为指定GID的文件
    -nouser            查找没有属主的文件
    -nogroup           查找没有属组的文件
    
    根据文件类型查找
    -type TYPE
    TYPE的形式:
    f:普通文件、d:目录文件、l:链接文件、s:套接字文件、b:块设备文件、c:字符设备文件、p:管道文件
    
    根据文件大小来查找
    

-size [+|-]SIZE 常用单位:k、M、G、c(byte),注意大小写敏感 SIZE:(SIZE-1,SIZE] 如:6k表示(5k,6k] +SIZE:(SIZE,∞) 如:+6k表示(6k,∞) -SIZE:[0,SIZE-1] 如:-6k表示[0,5k]

根据时间戳查找 以天为单位时: -atime [+|-]TIME -mtime -ctime TIME:[TIME,TIME+1) +TIME:[TIME+1,∞) -TIME:[0,TIME) 以分钟为单位时: -amin -mmin -cmin


2.7 根据权限查找

-perm [/|-]MODE MODE:精确权限匹配。 /MODE:任何一类(u,g,o)对象的权限中只要有一位匹配即可,或关系。+从centos7开始淘汰,开始使用/。 -MODE:每一类对象都必须同时拥有指定权限,与关系。 0:表示不关注


2.8 处理动作

-print 默认的处理动作,显示至屏幕 -ls find的内置命令,类似于对查找到的文件执行“ls -l”命令 -fls file 查找到的文件的长格式信息保存至指定文件中,相当于-ls > file -delete 删除查找到的文件 -ok COMMAND {} ; 对查找到的每个文件执行COMMAND命令,对每个文件执行命令之前,都会交互式要求用户 确认 -exec COMMAND {} ; 对查找到的文件执行COMMAND命令,不需要用户确认 注意:{}用于引用查找到的文件自身,;表示执行命令语法的结束。


### 打包压缩工具

1. 压缩和解压缩

1.1 gzip和gunzip

格式:gzip [OPTION]...FILE...


| 常用选项   | 说明                                     |
| ---------- | ---------------------------------------- |
| -k    keep | 保留原文件,Centos8的新功能              |
| -d         | 解压缩,相当于gunzip                     |
| -c         | 结果输出至标准输出,保留原文件不改变     |
| -#         | 指定压缩比,#取值为1-9,值越大压缩比越大 |

例子: 解压缩 gunzip file.gz

不解压缩的前提下查看文本文件内容 zcat file.gz


1.2 bzip2和bunzip2

格式:bzip2 [OPTION]...FILE...


| 常用选项   | 说明                                 |
| ---------- | ------------------------------------ |
| -k    keep | 保留原文件                           |
| -d         | 解压缩                               |
| -c         | 结果输出至标准输出,保留原文件不改变 |
| -#         | 压缩比,#取值为1-9,默认为9          |

例子: 解压缩 bunzip2 file.bz2

不显式解压缩的前提下查看文本文件内容 bzcat file.bz2


1.3 xz和unxz

格式:xz [OPTION]...FILE...


| 常用选项   | 说明                                 |
| ---------- | ------------------------------------ |
| -k    keep | 保留原文件                           |
| -d         | 解压缩                               |
| -c         | 结果输出至标准输出,保留原文件不改变 |
| -#         | 压缩比,#取值1-9,默认为6            |

例子: 解压缩 unxz file.xz

不显式解压缩的前提下查看文本文件内容 xzcat file.xz


1.4 zip和unzip

zip可以实现打包目录和多个文件成一个文件并压缩,但是会丢失文件属性信息,如所有者和所属组等信息,一般使用tar代替。

打包并压缩 zip -r /data/sysconfig.zip /etc/sysconfig/

不包括目录,只打包目录内的文件和子目录 cd /etc/sysconfig;zip -r /data/sysconfig.zip *

解压时,默认解压到当前目录 unzip /data/sysconfig.zip

解压到指定目录,如果指定目录不存在,会在其父目录(必须事先存在)下自动生成 unzip /data/sysconfig.zip -d /tmp/sysconfig


2. 打包和解包

tar:tar可以对目录和多个文件打包成一个文件,并且可以压缩,保留文件属性不丢失。

格式:tar [OPTION...] [FILE]...


| 常用选项 | 说明                   |
| -------- | ---------------------- |
| -f       | 指定要操作的文件       |
| -v       | 显示打包压缩的详细信息 |
| -c       | 打包                   |
| -x       | 解包                   |
| -t       | 查看归档的文件列表     |
| -z       | 相当于gzip压缩工具     |
| -j       | 相当于bzip2压缩工具    |
| -J       | 相当于xz压缩工具       |

例子: --exclude 排除文件 tar -zcvf /data/a.tar.gz --exclude=/app/host1 /app

-T 指定要打包压缩的文件列表 -X 指定要排除的文件列表 tar -zcvf /data/a.tar.gz -T /root/includefilelist -X /root/excludefilelist


3. 文件分割

split命令可以分割一个文件为多个文件

分割大的tar文件为多份小文件 split -b size tar-file-name prefix-name split -b 2M sysconfig.tar.gz sysconfig_part

切割后的文件使用数字后缀 split -b 2M -d sysconfig.tar.gz sysconfig_part

切割文件合并成一个大文件 cat sysconfig_part* > sysconfig.tar.gz


### 实例

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

![](https://s4.51cto.com/images/blog/202103/24/df62b653ba2abd494c5051c59ddd915d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

2. 打包/etc/目录下面所有conf结尾的文件,压缩包名称为当天的时间,并拷贝到/usr/local/src目录备份

![](https://s4.51cto.com/images/blog/202103/24/63800ca7eced52d2b89ded2334dd3f8f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

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

![](https://s4.51cto.com/images/blog/202103/24/ea39cb707f977a41d92684aad9119012.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)