1.shell脚本简介

  Shell 中文意思贝壳,寓意类似内核的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
  Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。shell脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。
  sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。

nux下使用Shell脚本实现进程监控 unix shell脚本_Shell

 

 

2.sh脚本语法

    1 )开头
    程序必须以下面的行开始(必须方在文件的第一行):
    #!/bin/sh
    符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
    当编写脚本完成时,如果要执行该脚本,还必须使其可执行。
    要使编写脚本可执行:
    编译 chmod +x filename 这样才能用./filename 来运行

    2 )注释
    在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。

    3 )变量
    在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,可以这样写:

1       #!/bin/sh
 2       #对变量赋值:
 3       a="hello world"
 4       # 现在打印变量a的内容:
 5       echo "A is:"
 6       echo $a
 7       #有时候变量名很容易与其他文字混淆,比如:
 8       num=2
 9       echo "this is the $numnd"
10       /*这并不会打印出"this is the 2nd",而仅仅打印"this is the",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:*/
11       num=2
12       echo "this is the ${num}nd"
13       这将打印: this is the 2nd

  实例:打印“hello”字符串

nux下使用Shell脚本实现进程监控 unix shell脚本_nux下使用Shell脚本实现进程监控_02

 

 

 

nux下使用Shell脚本实现进程监控 unix shell脚本_Shell_03

 

 

 

二.sh命令(参考链接:)

 

1.内置命令

sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。
    .file:读取并执行文件。
    break[n]:从最近的第n个嵌套循环中退出
    cd[dirname]:更换目录
    continue[n]:重启最近的第n个嵌套循环
    eval[arg...]:计算一次参数并让sh执行生成的命令
    exec[arg...]:通过这个sh执行命令,sh将会退出
    exit[n]:使sh退出,退出状态为n
    export[var...]:将变量导出到随后执行的命令
    read[var...]:从stdin中读取一行并为变量赋值
    set [arg...]:在执行环境中设置变量
    shift:将位置参数$2 $3...重命名为$1 $2....
    trap[arg][n]:接收到信号n后执行参数
    umask[ddd]:将掩码设置为八进制数ddd的
    wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
    read命令:当sh执行read命令时,它会等待来自stdin的输人行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。

 

2.Linux命令

      sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。下文列出并解释了其中一些命令。
    eho命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
    expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
    实用命令:除了上面的 Linux命令之外,sh还用许多其他实用程序作为命令。其中包括除了上面的Linux命令之外,sh还用许多其他实用程序作为命令。其中包括:
    awk:数据处理程序
    cmp:比较两个文件
    comm:选择两个排序文件共有的行
    grep:匹配一系列文件的模式
    diff:找出两个文件的差异。
    join:通过使用相同的键来连接记录以比较两个文件
    sed:流或行编辑命令
    sort:排序或合并文件
    tail:打印某个文件的最后n行
    tr:一对一字符翻译
    uniq:从文件中删除连续重复行

3.管道命令(参考链接:)

  通过内容过滤将输出重定向到文件是我们平日里的基本任务之一。
  除了文件输入重定向和输出重定向,Linux Shell 还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。

  Linux 管道使用竖线“|”连接多个命令,这被称为管道符。

    Linux 管道的具体语法格式如下:

      cmd1 | cmd2
      cmd1 | cmd2 [ | cmdN... ]

    当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。
    这里需要注意,cmd1 必须有正确输出,而 cmd2 必须可以处理 cmd1 的输出结果;而且 cmd2 只能处理 cmd1 的正确输出结果,不能处理 cmd1 的错误信息。cmd3也能够接收cmd2的正确输出,依次类推。

 

nux下使用Shell脚本实现进程监控 unix shell脚本_Shell_04

(使用管道命令在dev目录下寻找std开头的文件)

    cmd1:ls -l /dev “必须有正确的输出”,输出就是ls命令输出到标准输出文件stdout,其实就是输出到屏幕。上面操作说明的“第一个命令向标准输出写入”正是这个意思。
    cmd2: grep std 它从标准输入读出数据,进行字符串比对。也就是说,这个grep命令是从stdin读取的数据。上面操作说明的“而第二个命令是从标准输入读取”正是这个意思。

    一般新手肯定有这个疑问,既然“ls -l /dev”向屏幕文件stdout发送数据,grep是如何从stdin得到这个数据的呢?其实,这正是管道操作“|”干的活,管道操作“|”将“cmd1:ls -l /dev”的向stdout发送的数据,转而写入stdin,故此,“cmd2: grep std” 才能正常接收到数据。
    也就是说,管道操作“|”就是把左边命令的stdout数据,转而写到stdin,供右边的命令使用。

 

三.sh控制语句

1.if-else-fi语句

  if-else-fi语句的语法是:       if [ condition ]         then           statements         else           statements   fi   每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行。

实例:使用read与if-else-fi语句判断输入字符串(该语句对于空格要求较为严苛)

nux下使用Shell脚本实现进程监控 unix shell脚本_字符串_05

 

 

 

nux下使用Shell脚本实现进程监控 unix shell脚本_nux下使用Shell脚本实现进程监控_06

 

实例:使用使用if-elif-else-fi复合语句,对输入“yes”、“no”和其他字符串输出不同命令(该语句对于空格要求较为严苛)

 

nux下使用Shell脚本实现进程监控 unix shell脚本_数据_07

 

 

nux下使用Shell脚本实现进程监控 unix shell脚本_nux下使用Shell脚本实现进程监控_08

 

 

 

2.for语句

     for VARIABLE in string1 string2....stringr
      do
      commands
      done
在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。

3.while语句

while [ condition ]
    do
      commands
    done
  当条件为真时,sh将重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。

4.case语句

 case $variable in
    pattern1) command;;
    pattern2) command;;
    patternN) command;;
    esac

四.I/O重定向

当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件。I/O重定向有以下形式和含义:
  >file:  stdout转向文件,如果文件不存在 将会创建文件。
  >>file:  stdout追加到文件。
  <file:  将文件用作stdin;文件必须存在并 具有r权限。
  <<word:  从“here”文件中获取输人,直到只包含“word”的行。

五.sh函数

  sh函数的定义为:

func()

    {

      #function code

    }


  由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。
  在sh脚本中无法声明函数原型。
  sh函数的调用方式与sh脚本文件的执行方式完全相同。

 

六.问题与解决思路

  1、总结一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
    要素:
    (1)数据类型
    (2)常量
    (3)变量
    (4)运算符
    (5)表达式
    (6)标识符
    (7)关键字
    (8)数组
    (9)基本控制结构
    (10)函数
    (11)输入和输出
    (12)解释器和编译器
    技能:
    (1)数据结构的分析和设计
    (2)算法(即处理逻辑,微观层次)的分析和设计
    (3)系统架构(即处理逻辑,宏观层次)的分析和设计
  shell脚本:
    (1)用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
    (2)提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
  2、脚本是什么意思?sh脚本与sh有什么区别?
  根据百度百科的解释,脚本是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。 Shell是一种命令语言,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面。
  3、内置命令和外部命令的区别?
  内置命令就是Bash Shell 自带的命令,外部命名是 Linux 系统中的应用程序。
  内置命令的执行效率和资源消耗都优于外部命令。