Shell脚本的基本知识_Ongwu的博客-程序员宝宝

技术标签: 小壮学运维  《云计算基础》系列  运维  shell命令  linux  

简介

   变量是脚本语言的核心,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 @@         [email protected]@代表一段范围
     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.新建目录及子目录和普通的文件
    [[email protected] lianxi]# mkdir  qq
    [[email protected] lianxi]# cd qq/
    [[email protected] qq]# ls
    [[email protected] qq]# cp /etc/hosts  .
    [[email protected] qq]# ls
    hosts
    [[email protected] qq]# mkdir  image  sound
    [[email protected] qq]# ls
    hosts  image  sound
    [[email protected] qq]# cd image/
    [[email protected] image]# ls
    [[email protected] image]# echo 123 >1.txt
    [[email protected] image]# ls
    1.txt
    [[email protected] image]#
    [[email protected] image]# cd ..
    [[email protected] qq]# ls
    hosts  image  sound
    [[email protected] qq]# cd sound/
    [[email protected] sound]# echo "789" >3.txt
    [[email protected] sound]# ls
    3.txt
    [[email protected] sound]# cd ..
    [[email protected] qq]#
    [[email protected] qq]# cd ..
    
    
    2.生成一个升级版本的目录
    -r 递归的去比较子文件夹里的内容
    [[email protected] lianxi]# cp qq qqv2 -r
    
    [[email protected] lianxi]# diff -ur qq qqv2
    
    
    3.更新qqv2里的内容
    [[email protected] lianxi]# cd qqv2
    [[email protected] qqv2]# ls
    hosts  image  sound
    [[email protected] qqv2]# cp /etc/passwd .
    [[email protected] qqv2]# ls
    hosts  image  passwd  sound
    [[email protected] qqv2]# cd sound/
    [[email protected] sound]# echo "8900" >6.txt
    [[email protected] sound]# cd ..
    [[email protected] qqv2]# ls
    hosts  image  passwd  sound
    [[email protected] qqv2]# echo "123456" >hosts 
    [[email protected] qqv2]# ls
    hosts  image  passwd  sound
    [[email protected] qqv2]#
    [[email protected] qqv2]# cd ..
    [[email protected] lianxi]# diff -Nur  qq qqv2  
    -N 如果没有文件,就拿一个空文件和别的目录里的文件比较。
    比较文件夹生成补丁:
    [[email protected] 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]  删除0至9的数字    
    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   #文件是否是字符设备文件
  • 编写脚本——判断文件是否存在,存在的话,显示出该文件的类型

    [[email protected] mnt]# vim file_check.sh 
    [[email protected] 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
    }
    [[email protected] mnt]# sh file_check.sh 
    Please input a filename after script!!
    [[email protected] mnt]# sh file_check.sh tutu
    tutu not exist!!
    [[email protected] mnt]# touch tutu
    [[email protected] mnt]# sh file_check.sh tutu
    tutu exists and is a regular file !!
    [[email protected] mnt]# mkdir butter
    [[email protected] mnt]# sh file_check.sh butter
    butter exists and is a directory !!
    [[email protected] mnt]#

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hello_xiaozhuang/article/details/80711730

智能推荐

netty入门_xiaoyaGrace的博客-程序员宝宝

netty入门 Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的。那么Netty就是一种简化操作的一个成熟的网络IO编程框架。这里简单介绍一个程序,话不多说,直接上代码。一、服务器编写 1、Server代码,监听连接:[Java]纯文本查看复制代码? 01 02 03...

jenkins集成allure_小希zzz的博客-程序员宝宝_jenkins allure

一、jenkins插件中添加allure jenkis Pligin二、本地下载allure并且在jenkins的配置中添加路径三、jenkins构建中添加后置动作3.1 result-path为allure-results生成的原始文件文件夹,需要在源码里配置生成3.2report-path为html文件生成地址,由jenkins完成,我们只需要填写输出路径就可以了,我这边是放在\workspace\pytest_4\file 文件夹下四、file文件夹为.py文件位置用来运行pyte

chrome打开网页很慢,别的浏览器打开相同的网页很快_呼哈吧扎嘿的博客-程序员宝宝

我们的测试环境,同事总是吐槽打开很慢,但是我这里速度很正常,1s打开,他哪里经常性的超时,超时时间10s,开始以为是chrome的某些插件导致的,全部关闭发现不行并且,使用其他浏览器打开就很快,然后开始百度,最终发现,是chrome有一个默认设置,设置项的名称是 使用安全dns,关闭该选项即可...

Opencv学习笔记(八) -- 图像色彩空间转换_张慕风的博客-程序员宝宝

1.常见图像色彩空间RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色。 注: RGB是opencv图像加载时默认的色彩空间。默认的图像通道顺序为BGR。YUV 在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后...

20170511-algorithm-and-datastructure_deepindeed的博客-程序员宝宝

layout title tags categories date post 沧海遗珠:面试中碰到若干的问题 计算机视觉 CV算法 blog 2017-05-11 05:12:12 -0700 缺省情况下C++在global作用域内...

BZOJ 3687: 简单题 bitset_weixin_30294021的博客-程序员宝宝

3687: 简单题Time Limit: 10 SecMemory Limit: 512 MB[Submit][Status][Discuss]Description小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和。2.子集的异或和的异或和。3.子集的算术和的算术和。4.子集的算术和的异或和。 目前为止,小呆已...

随便推点

Ubuntu16.04下安装tensorflow-gpu_言寺之风雅颂的博客-程序员宝宝

Tensorflow学习过程中有些代码在windows下运行会有许多问题,ubuntu系统还是得用。开始的时候为了跑通代码,就在虚拟机里面安装了一个Ubuntu16.04,但是这样GPU无法使用,只能用CPU版的tensorflow运行程序,最近在跑一个图像语义分割的训练代码,用i7-8700跑一天特么的才走了4000多次,10万次的话就奔着1个月去了,这可不行,物理机装上Ubuntu,鼓捣一番,...

thchs30跑过程中注意事项_Xwei1226的博客-程序员宝宝

尽量使用最新的版本,之需要改下面的第一个问题,就可以全部跑通,新的版本中beam size 是6, 就不会有问题了。按照github上的版本直接跑的过程中遇到两个问题: 1. 在 make word graph的过程中字典正确的没有拷贝到本地: 在 14.04 下面没有问题,在16.04 下面出现问题了。 cat $thchs/resource/dict/lexicon.txt $thchs/d...

【R语言】解决GO富集分析绘图,标签重叠问题_Mrrunsen的博客-程序员宝宝_r语言go绘图

利用clusterProfiler这个包绘制GO富集分析气泡图和柱形图的时候,发现GO条目的名字都重叠在一起了。气泡图柱形图这个图别说美观了,简直不忍直视。经过小编的认真研究,发现跟R版本有关。前面小编给大家展示的基本都是R 3.6.3做出来的图。很多粉丝可能用的都是最新版本的R 4.1.2。我们知道R的版本在不停的更新,相应的R包也在不停的更新。小编把绘制气泡图和柱形图相关的函数拿出来认真的研究了一下,终于发现的症结所在。dotplot这个函数,多了个label_for

chrome62 js的处理滚动条 以及指定滚动到某一个元素_weixin_30437847的博客-程序员宝宝

按照悠悠书上的去处理。发现我的版本反而行不通。就行着悠悠的路。反过来走。反而通了。不知道为毛。能通就行了版本:chrome62,selenium 3.8.0语言:python 2.7.6js滚动条处理:学习网上各个的方式js = "var q=document.body.scrollTop=100000" 滚动到最底部js1 ="var q=doc...

大一下 数据结构 清华严蔚敏(C语言)版 学习记录——树和二叉树_goodlunatic的博客-程序员宝宝

#include&lt;bits/stdc++.h&gt;#define MAX_TREE_SIZE 100//二叉树的最大结点数#define OK 1#define OVERFLOW -2#define ERROR 0typedef TElemType SqBiTree[MAX_TREE_SIZE];//0号单元存储根节点typedef int Status;SqBiTree bt;typedef struct BiTree{ TElemType data; stru.

grbl学习之旅---serial篇_被选召的孩子的博客-程序员宝宝

serial.c和serial.h文件是实现了通过串行端口发送和接受字节的功能。首先是serial.h中定义了基本函数和常量大小:#ifndef RX_BUFFER_SIZE #define RX_BUFFER_SIZE 128//定义接受缓存的大小#endif#ifndef TX_BUFFER_SIZE #define TX_BUFFER_SIZE 64//定义发送缓存的大小#en...

推荐文章

热门文章

相关标签