脚本入门之shell_script

脚本定义

       Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

       换一种说法也就是,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。

更明白地来说,shell script就像早期dos年代的bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。

       shell和shell脚本有什么区别?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言(就是你所说的shell脚本)。作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。

创建脚本

1)

vim haha.sh
一般情况下脚本一.sh结尾,这不是系统规定的,而是一种业界规范

2)

#!/bin/bash
脚本头的写法,这是脚本使用的解释器,也就是默认脚本运行时开启的子shell

3)

脚本内容是用明令和明令执行的逻辑关系组成

4)

脚本执行方法

方法一:
    sh 脚本名称
方法二:
    chmod +x 脚本
    脚本名称调用

脚本书写规范

1)脚本中应添加脚本的说明信息

Author         :M
Email          :[email protected]
Version        :1.1
Create_Date    :2017-08-21
Description    :jie shi

2)脚本中尽量不要使用中文,哪怕用拼音代替

3)脚本中出现的( )|[ ]|{ }|<>等等成对出现的符号要一次打出,并且内容中的字符与这些符号要有空格

4)脚本中的语句要一次写完在丰富内容
5)语句中使用的动作要缩进写入,使脚本易读
6)如何让vim自动添加脚本说

 vim /etc/vimrc             编辑vim配置文件
map <F4> ms:call AddTile()<cr>'s              设置快捷键
function AddTile()                                            设定函数内容
        call append(0,"#!/bin/bash")
        call append(1,"################################")
        call append(2,"#Author              :M")
        call append(3,"#Email                :[email protected]")
        call append(4,"#Version             :")
        call append(5,"#Create_Date      :".strftime("%Y-%m-%d"))
        call append(6,"#Description       :")
        call append(7,"################################")
endfunction

常用命令

1)diff            比较两个文件的不同

-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用; 
-a或——text:diff预设只会逐行比较文本文件; 
-b或--ignore-space-change:不检查空格字符的不同; 
-B或--ignore-blank-lines:不检查空白行; 
-c:显示全部内容,并标出不同之处; 
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同; 
-d或——minimal:使用不同的演算法,以小的单位来做比较; 
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集; 
-e或——ed:此参数的输出格式可用于ed的script文件; 
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
 -H或--speed-large-files:比较大文件时,可加快速度; 
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异; 
-i或--ignore-case:不检查大小写的不同; 
-l或——paginate:将结果交由pr程序来分页; 
-n或——rcs:将比较结果以RCS的格式来显示; 
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较; 
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称; 
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较; 
-q或--brief:仅显示有无差异,不显示详细的信息; 
-r或——recursive:比较子目录中的文件; 
-s或--report-identical-files:若没有发现任何差异,仍然显示信息; 
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较; 
-t或--expand-tabs:在输出时,将tab字符展开; 
-T或--initial-tab:在每行前面加上tab字符以便对齐; 
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同; 
-v或——version:显示版本信息; 
-w或--ignore-all-space:忽略全部的空格字符; 
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽; 
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录; 
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件; 
-y或--side-by-side:以并列的方式显示文件的异同之处; 
--help:显示帮助; 
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容; 
--suppress-common-lines:在使用-y参数时,仅显示不同之处。


vimdiff     用vim编辑器打开两个文件比较不同

补丁

安装生成补丁的程序


diff -u file file1 > file.path            生成补丁文件
patch  file file.path                       打补丁
patch -b file file.path                    -b标示备份原文件为file.orig


2)grep

grep -n              查找关键词,显示行号    
grep -n3            查找关键词显示所在行及上下三行内容
grep -A3            查找关键词显示所在行及下面三行内容
grep -B3            查找关键词显示所在行及下面三行内容
grep -i               查找关键词,不区分大小写
grep -v              反向过滤,显示不带关键字的所有内容
grep -E              多重选择      用法 grep -E '关键词1|关键词2'
grep ^test         以test开头的行
grep test$         以test结尾的行
grep "\<test"     以test开头的行
grep "test\>"     以test结尾的行

3) cut

-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f  :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
4) awk
  • awk基本用途
    1、简单输出,如 awk ‘{print 1,NF}’ — print的规则
    2、作为分隔符使用
    单字符分隔符:打印系统中用户名和其他使用shell类型
    单字符分隔符,管道连续使用awk:打印nginx日志中的访问目录。
    多字符分隔符:抓取apache详细版本
    多字符多个分隔符:截取ip地址
    正则分隔符:截取ip地址

awk -F ":" '{print $1}' passwd                  以:为分隔符,显示文件passwd中第一个域
5) echo

echo -n              不换行
echo -e               若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
   \a 发出警告声;
   \b 删除前一个字符;
   \c 最后不加上换行符号;
   \f 换行但光标仍旧停留在原来的位置;
   \n 换行且光标移至行首;
   \r 光标移至行首,但不换行;
   \t 插入tab;
   \v 与\f相同;
   \\ 插入\字符;
   \nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息   
echo -e "\r    \r"          光标回到行首       
6)sed

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!



变量

作用:




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

智能推荐

PoolThreadCache

缓存构成   PoolThreadCache的缓存由三部分构成:tiny、small 和 normal。 tiny   缓存数据大小区间为[16B, 496B]数据,数组长度为32,根据数据大小计算索引的办法:数据大小除以16,如下代码所示: small   缓存数据大小区间为[512B, 4KB]数据,数组长度为4,根据数据大小计算索引的办法:数据大小除以512,然后log2得到指数,如下代码所...

Intellij IDEA 搭建Spring Boot项目(一)

Intellij IDEA 搭建Spring Boot项目 标签(空格分隔): SpringBoot JAVA后台 第一步 选择File –> New –> Project –>Spring Initialer –> 点击Next  第二步 自己修改 Group 和 Artif...

CentOS学习之路1-wget下载安装配置

参考1: https://blog.csdn.net/zhaoyanjun6/article/details/79108129 参考2: http://www.souvc.com/?p=1569 CentOS学习之路1-wget下载安装配置 1.wget的安装与基本使用 安装wget yum 安装软件 默认安装保存在/var/cache/yum ,用于所有用户使用。 帮助命令 基本用法 例子:下载...

深入浅出Spring的IOC容器,对Spring的IOC容器源码进行深入理解

文章目录 DispatcherServlet整体继承图 入口:DispatcherServlet.init() HttpServletBean.init() FrameworkServlet.initServletBean() 首先大家,去看Spring的源码入口,第一个就是DispatcherServlet DispatcherServlet整体继承图 入口:DispatcherServlet....

laravel框架的课堂知识点概总

1. MVC 1.1 概念理解 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑 MVC 是一种使用 MVC(Model View Controller ...

猜你喜欢

Unity人物角色动画系统学习总结

使用动画系统控制人物行走、转向、翻墙、滑行、拾取木头 混合树用来混合多个动画 MatchTarget用来匹配翻墙贴合墙上的某一点,人物以此为支点翻墙跳跃 IK动画类似于MatchTarget,控制两只手上的两个点来指定手的旋转和位置,使得拾取木头时更逼真 创建AnimatorController: 首先创建一个混合树,然后双击 可以看到该混合树有五种状态机,分别是Idle、WalkForward、...

Composer 安装 ThinkPHP6 问题

Composer 安装 ThinkPHP6 问题 先说说问题 一.运行环境要求 二.配置 参考: ThinkPHP6.0完全开发手册 先说说问题 执行ThinkPHP6的安装命令 遇到问题汇总如下: 看提示是要更新版本,执行命令更新。 更新之后,再次安装ThinkPHP,之后遇到如下问题。 尝试了很多方法,依然不能解决。其中包括使用https://packagist.phpcomposer.com...

Spring Boot 整合JDBC

今天主要讲解一下SpringBoot如何整合JDBC,没啥理论好说的,直接上代码,看项目整体结构 看一下对应的pom.xml 定义User.java 定义数据源配置,这里使用druid,所以需要写一个配置类 上面指定druid的属性配置,和用户登录的账号信息以及对应的过滤规则: 下面定义数据访问接口和对应的实现: 数据访问层很简单,直接注入JdbcTemplate模板即可,下面再看对应的servi...

html鼠标悬停显示样式

1.显示小手:     在style中添加cursor:pointer 实现鼠标悬停变成小手样式     实例:         其他参数: cursor语法: cursor : auto | crosshair | default | hand | move | help | wait | tex...

Yupoo(又拍网)的系统架构

Yupoo!(又拍网) 是目前国内最大的图片服务提供商,整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息: 操作系统:CentOS、MacOSX、Ubuntu 服务器:Apache、Nginx、Squid 数据库:MySQLmochiweb、MySQLdb 服务器监控:Cacti、Nagios、 开发语言:PHP、Python、Erlang、Java、Lua 分布式计算:Hadoop...