shell脚本可以自动管理系统,类似早期的批处理文件(百度词条定义:批处理文件是扩展名为·bat 或·cmd的文本文件,包含一条或多条命令,由DOS或Windows系统内嵌的命令解释器来解释运行)。
shell脚本拥有更强大的功能,可以进行类似程序(program)的编写,且不需要编译(compile)就能够执行,整个Linux环境中,一些服务(services)的启动都是通过shell脚本完成

什么是shell脚本

shell脚本划分为shell 与脚本(script)
shell:与Linux内核沟通的接口
脚本:剧本
shell脚本:利用shell的功能所写的一个程序。这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。

为什么要学习shell脚本

  • 自动化管理的重要依据
    每天要进行的任务就有查询日志文件、跟踪流量、监控用户使用主机状态、主机各项硬件设备状态、主机软件更新查询等
  • 跟踪与管理系统的重要工作
    虽然/etc/init.d/* 这个脚本启动的方式(System V)已经被新一代的systemd所替代(从CentOS 7开始),但是仍然有很多服务在管理服务启动方面还是使用shell
  • 简单入侵检测功能
    可以在固定的几分钟内主动地去分析系统日志文件,若察觉有问题,就立刻通知管理员或是立刻加强防火墙地设置规则
  • 连续命令单一化
    最简单地功能就是集合一些在命令行地连续命令,将其写入脚本文件当中,而由直接执行脚本来启动一连串的命令行命令输入
  • 简易的数据处理
    shell脚本直接处理数据的对比、文字数据的处理等,编写方便,速度又快(因为Linux性能较佳)
  • 跨平台支持与学习历程较短
    几乎所有的UNIX-like 上面都可以运行shell脚本,连Windows系列也有相关的脚本模拟器可以用,此外shell也可以用vim来编写

总结:shell脚本用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上,就不够好了,原因在于shell脚本的速度较慢,且使用的CPU资源较多,会造成主机资源的分配不良。

第一个脚本的编写与执行

shell脚本的编写注意事项:

  • 1.命令是从上而下、从左而右地分析与执行
  • 2.命令、选项与参数间地多个空格都会被忽略掉
  • 3.空白行也将被忽略掉,并且[Tab]键所产生地空白同样视为空格键
  • 4.如果读取到一个Enter符号(CR),就尝试开始执行该行(或该串)命令
  • 5.如果同一行地内容太多,则可以使用[\Enter]来扩展至下一行
  • 6.[#]可作为注释,任何加在#后面地数据将全部被视为注释文字而被忽略
    shell脚本的执行(例如程序shell脚本为/home/jtao/shell.sh)
  • 1.直接命令执行:shell.sh文件必须要具备可读与可执行(rx)的权限
  • 绝对路径:使用/home/jtao/shell.sh 来执行命令
  • 相对路径:使用相对目录./**//shell.sh 来执行
  • 2.变量[PATH]功能:将shell.sh放在PATH指定的目录内,例如:~/bin/
  • 以bash程序来执行:通过[bash shell.sh]或[sh shell.sh]来执行

何为./shell.sh

直接shell.sh会以命令顺序去查找,如果bash内有相应的shell则会先查找到/usr/bin内的。所以./shell.sh 保证会查找到当前路径的shell文件(必须要有r、x权限)

何为sh shell.sh

image.png
/bin/sh 其实就是 /bin/bash(链接文件),使用sh shell.sh亦即告诉系统我想要直接以bash的功能来执行 shell.sh 这个文件内的相关命令的意思,所以此时shell.sh只要有r的权限即可被执行

编写第一个脚本

由Hello World! 开始
image.png

  • 1.第一行以#!/bin/bash 在声明这个脚本使用的shell名称
    必须以#! 开头,这2个符号[#!]被称为shebang ,因为以bash运行,所以必须为#!/bin/bash 来声明这个文件内使用bash的语法。 那么当 这个程序被执行时,它就能够加载bash的相关环境配置问题。
    在很多错误的情况中,如果没有设置这一行,那么该程序很可能给会无法执行,因为系统无法判断该程序需要使用什么shell来执行
  • 2.程序内容的说明
    除了第一行的#!是用来声明shell的之外,其他的#都是注释用途,要注释养成记录:
    1.内容与功能
    2.版本信息
    3.作者与联络方式
    4.建文件日期
    5.历史纪录
  • 3.主要环节变量的声明
    将一些重要的环境变量设置好,PATH与LANG(如果有使用到输出相关的信息)是最重要的
  • 4.主要程序部分
    主程序的脚本代码
  • 5.执行结果告知
    image.png
    一个程序执行成功与否剋使用[$?]变量来观察
    那么我们可以利用exit这个命令来让程序中断,并且返回一个数值给系统。
    执行echo $?

建立shell脚本的良好编写习惯

如果程序的说明能够清楚,那么对自己也会有很大的帮助
在每个脚本的文件头处记录好:

  • 脚本的功能
  • 脚本的版本信息
  • 脚本的作者与联络方式
  • 脚本的版权声明方式
  • 脚本的History(历史纪录)
  • 脚本内较特殊的命令,使用绝对路径的方式来执行
  • 脚本运行时需要的环境变量预先声明与设置
    程序代码部分:
  • 代码的编写最好使用缩进方式,在包覆的内部程序代码最好能以[Tab]按键的空格向后推
  • 脚本的编写工具最好使用vim而不是vi,因为vim有额外的语法检查功能,能够在第一阶编写时就发现语法方面的问题

简单的shell脚本练习

简单范例

交互式脚本:变量内容由用户决定

  • 例:用户输入firstname与lastname,屏幕显示Your full name is:
    image.png
    image.png
    用户自己输入的变量可以让程序所使用

随日期变化:利用date建立文件

数据库么天的数据都不太一样,因此当备份时,每天的数据都备份成不同的文件名,这样才能够让旧的数据也能够保存下不被覆盖
image.png
image.png

数值运算:简单的加减乘除

bash shell 里面默认仅支持到整数的数据
var=$((运算内容))

数值运算:通过bc计算Pi(圆周率)

计算Pi时,小数点以下位数可以无限制地扩展下去,而bc提供了一个运算Pi地函数,要使用该函数必须通过bc -l 来调用才行,且要控制小数点位数。

脚本地执行方式差异(source、sh script、./script)

不同的脚本执行方式会造成不一样地结果,尤其对bash 的环境影响很大。
脚本的执行还可以用soucre或小数点(.)来执行

利用直接执行的方式来执行脚本,在子进程中执行

  • 直接执行命令(绝对或相对路径)
  • bash(或sh)执行脚本
    利用上述方式执行时会使用新的bash环境来执行脚本内的命令,即子进程bash内执行。故子进程完成后,在子进程内的各项变量或操作将会结束而不会传到父进程中
    image.png

source 来执行脚本,在父进程中执行

source 执行的脚本会在父进程中执行。所以不注销系统而要让某些写入~./bashrc 的设置生效时,需要使用source 而不能使用bash

善用判断式

条件判断式

循环(loop)

shell脚本的跟踪与调试

不需要通过直接执行脚本文件就可以判断是否有问题
sh [-nvx] scripts.sh
选项与参数:

  • -n:不要执行脚本,仅查询语法的问题,若语法没有问题,则不会显示任何信息
  • -v:在执行脚本前,先将脚本文件的内容输出到屏幕上
  • -x:将使用到的脚本内容显示到屏幕上
    利用如下脚本
    image.png
    image.png
    image.png
    在上述图片加号后面的数据其实都是命令串,由于sh -x 的方式将命令执行过程也显示出来,这样用户就可以判断程序代码执行到哪一行时会出现相关的信息。 通过完整的命令串,能够依据输出的错误信息来修改脚本文件

这个家伙很懒,啥也没有留下😋