小壮学运维30--Shell脚本的基本知识

简介

   变量是脚本语言的核心,shell脚本又是无类型的。变量本质上存储数据的一个或多个计算机内存地址,分为本地变量(用户当前shell生命期使用,随shell进程的消亡而无效,类似局部变量)、环境变量(适用于所有由登录进程所产生的子进程)和位置参数(向shell脚本传递参数,只读)。而shell使用变量就需要引用,它们密切相关。


一.diff命令

diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

  • -u:会将不同的地方放在一起,紧凑易读;
  • -r: 递归比较目录下的所有文件;
  • 利用diff命令生成补丁
  • 文件和文件的比较:

    # diff -u chinaitsoft.txt  chinaitsoft_v2.txt 
    
    --- chinaitsoft.txt
    +++ chinaitsoft_v2.txt   
    @@ -1,4 +1,6 @@         ---@@代表一段范围
     jinan                  -代表第一个文件
    +changqing                    
     linux
     chinasotf
    
    +teacher feng
    # diff -u chinaitsoft.txt  chinaitsoft_v2.txt >v1-to-v2.patch
    生成补丁,补丁叫作v1-to-v2.patch

    patch 打补丁命令

    用途:用来打补丁修补文件

    格式:patch [选项] 原始文件 < 补丁文件

    • -pN: N表示忽略N层路径;
    • -R: 还原到老版本。 
      注意事项:
    • 如果打多个补丁,注意先后顺序;
    • 打补丁前不要修改源文件。
    # patch  chinaitsoft.txt <v1-to-v2.patch 
    patching file chinaitsoft.txt
    # diff chinaitsoft.txt chinaitsoft_v2.txt 
    还原到原来的版本--->撤销打补丁
    # patch -R chinaitsoft.txt <v1-to-v2.patch 
    patching file chinaitsoft.txt
    # diff chinaitsoft.txt chinaitsoft_v2.txt 
    1a2
    > changqing
    3a5
    > fenglaoshi
    • 目录和目录的比较
    1.新建目录及子目录和普通的文件
    [root@chinaitsoft lianxi]# mkdir  qq
    [root@chinaitsoft lianxi]# cd qq/
    [root@chinaitsoft qq]# ls
    [root@chinaitsoft qq]# cp /etc/hosts  .
    [root@chinaitsoft qq]# ls
    hosts
    [root@chinaitsoft qq]# mkdir  image  sound
    [root@chinaitsoft qq]# ls
    hosts  image  sound
    [root@chinaitsoft qq]# cd image/
    [root@chinaitsoft image]# ls
    [root@chinaitsoft image]# echo 123 >1.txt
    [root@chinaitsoft image]# ls
    1.txt
    [root@chinaitsoft image]#
    [root@chinaitsoft image]# cd ..
    [root@chinaitsoft qq]# ls
    hosts  image  sound
    [root@chinaitsoft qq]# cd sound/
    [root@chinaitsoft sound]# echo "789" >3.txt
    [root@chinaitsoft sound]# ls
    3.txt
    [root@chinaitsoft sound]# cd ..
    [root@chinaitsoft qq]#
    [root@chinaitsoft qq]# cd ..
    
    
    2.生成一个升级版本的目录
    -r 递归的去比较子文件夹里的内容
    [root@chinaitsoft lianxi]# cp qq qqv2 -r
    
    [root@chinaitsoft lianxi]# diff -ur qq qqv2
    
    
    3.更新qqv2里的内容
    [root@chinaitsoft lianxi]# cd qqv2
    [root@chinaitsoft qqv2]# ls
    hosts  image  sound
    [root@chinaitsoft qqv2]# cp /etc/passwd .
    [root@chinaitsoft qqv2]# ls
    hosts  image  passwd  sound
    [root@chinaitsoft qqv2]# cd sound/
    [root@chinaitsoft sound]# echo "8900" >6.txt
    [root@chinaitsoft sound]# cd ..
    [root@chinaitsoft qqv2]# ls
    hosts  image  passwd  sound
    [root@chinaitsoft qqv2]# echo "123456" >hosts 
    [root@chinaitsoft qqv2]# ls
    hosts  image  passwd  sound
    [root@chinaitsoft qqv2]#
    [root@chinaitsoft qqv2]# cd ..
    [root@chinaitsoft lianxi]# diff -Nur  qq qqv2  
    -N 如果没有文件,就拿一个空文件和别的目录里的文件比较。
    比较文件夹生成补丁:
    [root@chinaitsoft lianxi]# diff -Nur  qq qqv2  >patch-v2.txt
    /u/howard/src/blurfl/blurfl.c
    -p3 的效果就是去掉第3个/前面的内容,效果如下:
    src/blurfl/blurfl.c
    -p4 的效果就是去掉第4个/前面的内容,效果如下:
    blurfl/blurfl.c

    cut命令(截取)

    从文本文件或者文本流中提取文本列 
    格式:cut -选项 提取范围 文本文件常见选项

    • -c:从指定提取范围中提取字符;
    • -f:从指定提取范围中提取字段(=列);
    • -d:指定分隔符默认是Tab。
    #cut -d “:” -f 1,7 /etc/passwd
    #who | cut  -d ' '  -f1,6          提取范围
    • n:第n项;
    • n-:第n项到行尾;
    • -m:行首到第m项;
    • n,m:第n项和第m项—单个的截取;
    • n-m:第n项到第m项。
    # cat name.txt |cut -c 2
    将文件里的每一行的第2个字符截取出来
    u
    1
    1
    2
    3

    # cat name.txt |cut -c 2-5   截取第2个字符到第5个字符
    umbe
    12  
    11  
    2   
    3   
    # cat name.txt |cut -c -10  ---行首到第十项
    number nam
    112      l
    111      l
    22      zh
    23      de
    # cat name.txt |cut -c 5-    ---第五项到末尾
    er name  age  address   phone
         liu   18    shandong 123
         li    20    hennan   345
        zhang 16    beijing  789
        deng  86    hubei    467
    
    # cat name.txt 
    number name  age  address   phone
    112      liu   18    shandong 123
    111      li    20    hennan   345
    22      zhang 16    beijing  789
    23      deng  86    hubei    467
    # cat name.txt |tr -s " "|cut -d " " -f 3
    age
    18
    20
    16
    86
    # cat name.txt |tr -s " "|cut -d' ' -f3
    age
    18
    20
    16
    86

    sort命令(不改变源文件

    作用:排序。默认按每行的第一个字符排序。

    • -n:按数值大小进行排序;
    • -r:递减排序(整行整行的处理) reverse;
    • -k 3 指定第三列为排序键;
    • -t: 指定字段分割符(默认分隔符是空白(空格、Tab))。

    PS: 
    sort排序是按照行来排序的,可以理解为一行是一个整体!!


    uniq命令

    数据的实例统计。 
    作用:删除经过排序后的数据的重复记录。通常和sort连用。sort -n 文件 | uniq

    • -c:统计特定记录出现的次数;
    • -u:只显示唯一的行;
    • -d:只显示重复的行。
    # cat access_log |awk '{print $1}'|sort |uniq -c|sort  -nr|head -3  ---只取第一列
        666 172.16.68.155
        648 172.16.70.199
        490 172.16.88.88

    字符转换

    tr 的作用一:替换(不改变源文件)

    作用:字符转换工具 
    只能对stdin操作,不能直接对文件操作 
    格式: tr set1 set2 (同一位置set2替换set1) 
    例① 普通的替换

    # echo 123456123456|tr 345 abc
    12abc612abc6

    例② 在文本里的替换

    # tr heze jinan < fuxingkai.txt 
    fuxingkai njongyiyang
    jana
    laarning linux

    所以,并不能单词替换单词,仅仅是单个字符的一一对应替换!

    例③ [ ]中括号表示范围的替换

    # tr [a-z] [A-Z] <fuxingkai.txt 
    FUXINGKAI ZHONGYIYANG
    HEZE
    LEARNING LINUX

    例④:

    # tr    ':'   '\n' <fuxingkai.txt 
    将文件中的:全部替换为换行

    tr的作用二:删除

    tr -d  [0:9]  删除09的数字    
    tr -d  ‘%’    删除%字符

    tr的作用三:压缩(去重)

    tr -s  SET        
    将连续相同的字符压缩成一个字符
    # echo "1   2   3  4"|tr -s ' '  '\t'
    1    2    3    4
    (\t  代表制表符)

    单引号和双引号的不同

    • 单引号:输出纯字符,特殊符号失去作用;
    • 双引号:元字符可以有特殊含义。
    # meinv=qianqian    ---定义变量meinv,赋值qianqian
    # echo "$meinv"     ---输出meimv的值
    qianqian
    # echo '$meinv'     ---输出$meinv
    $meinv

    $ 元字符:能代表其他含义的字符,有特殊含义的字符,并不是代表本身字符的含义。

    && 和 ||
    && 表示前一条命令执行成功时,才执行后一条命令 
    方式:command1 && command2 
    如果command1执行成功,则执行command2 
    || 表示上一条命令执行失败后,才执行下一条命令 
    方式:command1 || command2 
    如果command1执行失败,则执行command2
  • test 

    • test 命令与[] 等同
    • test "$A" == "$B" 等同于 [ "$A" == "$B" ]
    linux中shell编程中的test常见用法:
    
     1. 判断表达式
    if test                  #表达式为真
    if test !                #表达式为假
    test 表达式1 –a 表达式2    #两个表达式都为真
    test 表达式1 –o 表达式2    #两个表达式有一个为真
    test 表达式1 ! 表达式2     #条件求反
     2. 判断字符串
    test –n 字符串            #字符串的长度非零
    test –z 字符串            #字符串的长度是否为零
    test 字符串1=字符串2       #字符串是否相等,若相等返回true
    test 字符串1!=字符串2      #字符串是否不等,若不等返回false
     3. 判断整数
    test 整数1 -eq 整数2       #整数相等
    test 整数1 -ge 整数2       #整数1大于等于整数2
    test 整数1 -gt 整数2       #整数1大于整数2
    test 整数1 -le 整数2       #整数1小于等于整数2
    test 整数1 -lt 整数2       #整数1小于整数2
    test 整数1 -ne 整数2       #整数1不等于整数2
     4. 判断文件(常用)
    test File1 –ef File2    两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode。
    test File1 –nt File2    判断文件1是否比文件2新
    test File1 –ot File2    判断文件1比是否文件2旧
    test –e File   #文件是否存在 
    test –f File   #文件是否为正规(普通)文件 
    test –L File   #文件是否是一个符号链接(同-h)
    test –S File   #文件是否是套接字
    test –b file   #文件是否是块设备文件
    test –d File   #文件是否是目录
    test –c File   #文件是否是字符设备文件

  • 编写脚本——判断文件是否存在,存在的话,显示出该文件的类型

    [root@localhost mnt]# vim file_check.sh 
    [root@localhost mnt]# cat file_check.sh 
    ##################################
    # Author:        xiaozhuang      #
    # Version:                       #
    # Mail:                          #
    # Date:          2018-06-15      #
    # Description:                   #
    #                                #
    ##################################
    
    #!/bin/bash
    [ -z "$1" ]&&{
        echo "Please input a filename after script!!"
        exit 1
    }
    [ -e "$1" ]||{
        echo "$1 not exist!!"
        exit 0
    }
    [ -f "$1" ]&&{
        echo "$1 exists and is a regular file !!"
        exit 0
    }
    [ -d "$1" ]&&{
        echo "$1 exists and is a directory !!"
        exit 1
    }
    [root@localhost mnt]# sh file_check.sh 
    Please input a filename after script!!
    [root@localhost mnt]# sh file_check.sh tutu
    tutu not exist!!
    [root@localhost mnt]# touch tutu
    [root@localhost mnt]# sh file_check.sh tutu
    tutu exists and is a regular file !!
    [root@localhost mnt]# mkdir butter
    [root@localhost mnt]# sh file_check.sh butter
    butter exists and is a directory !!
    [root@localhost mnt]#

猜你喜欢

转载自blog.csdn.net/hello_xiaozhuang/article/details/80711730