脚本入门之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          :M@qq.com
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                :M@qq.com")
        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 就是啦!



变量

作用:




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一直很喜欢写unix shell script, 因为写那么一点点东西可以有那么多效果,投入小,产出大,爽啊. 在写IBM AIX K Shell script时,感觉不那么友好,主要是有一些格式细节要求比较严格,不太习惯,后来写惯了也就好了,下面的三个script是我为公司最近写的 一个自动备份shell script,基本要求就是每天晚上23:00自动跑起来,看file system /health used space是否超过了 60%,超过了就压缩三个目录下的 .dat, .log.文件, 压缩方式是gzip(.gz),本来 bzip2(.bz)的压缩率比 .gz要大1.5倍左右, 因为考虑到要 用 zgrep工具直接在文件中search字符串,而且影盘容量足够大,所以也就用gzip了.我自己感觉这三个 k shell script基本上把 aix 的 k shell script的一些特性都覆盖到了,所以就用这个例子, 文本分析我用了awk, 没用 perl,因为用不上perl那些超强的extended regular expression分析,我就用了awk,附件中有个awk文件的例子,awk也可以做比较复杂的分析,但肯定没有perl那样强,主要是perl超级强大的extended regular expression分析. 但是如果你要OOP而且要复杂文本分析,我建议你用perl或者如果你用java你就可以用oro来做perl文本分析,我的一个附件是在java中用oro进行文本分析的代码片段. 先讲一讲 IBM AIX k shell script的一些注意事项吧: (1) 注意 if 中括号的间距 (2) 注意数据的等于和字符串的等于 (3) 注意 function的返回只能是数值而且返回的数值不能太大 (4) 注意怎样才能给一个数组赋值-用空格分隔的一串数据赋予一个数组 其他的flow control ( if , for, case等),没有什么太需要注意的,可用本例子 直接作参考.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值