随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。
在一些复杂的Linux维护找工作中,大量重复性的输入和交互操作不但费时费力,而且容易出错,而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担。
shell脚本的概念:
将要执行的命令按顺序保存到一个文件文本
给该文件可执行权限,便可运行
可结合各种shell控制语句以完成更复杂的操作
shell脚本应用场景:
重复性操作
批量事务处理
自动化运维
服务运行状态监控
定时任务执行
…
(1)命令解释器,“翻译官”
介于系统内核与用户之间,负责解释命令行
(2)用户的登录shell
登录后默认使用的shell程序,一般为/bin/bash
Shell脚本简单的说,只要将平时使用的各种Linux命令按顺序保存到一个文本文件,然后添加执行权限,这个文件就成为一个Shell脚本了。
例如,执行以下操作可以创建第一个脚本文件:first.sh
使用vim文本编辑器
每行一条Linux命令,按执行顺序依次编写
脚本后缀为.sh
上述first.sh脚本文件中,包括三条命令:cd /boot/、pwd、ls -lh vml*。执行此脚本文件后,输出结果与依次单独执行这三条命令是相同的,从而实现了“批量处理”的自动化过程。
当然这边执行脚本文件也有三种方法
还有一个合格的Shell脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息、更加容易读懂。对于代码较多、结构复杂的脚本,应添加必要的注释文字。改写后的first.sh脚本内容如下。
第一行是一行特殊的脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行;
其他以“#”开头的语句表示注释信息;
echo命令用于输出字符串,以使脚本的输出信息更容易读懂。
由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不要用户干预。因此学会提取、过滤执行信息变得十分重要。Shell环境中的两个I/O操作:管道、重定向,就是此作用,
Linux系统使用文件来描述各种硬件、设备等资源,用户通过操作系统处理信息的过程中,包括以下几类交互设备文件。
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
将左侧的命令输出结果,作为右侧命令的处理对象(前后有关系时使用)
Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell程序能够提供更加灵活的功能,实用性更强。
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置,系统环境的变化而变化
变量的类型
自定义变量:由用户自己定义,修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
自定义变量是由系统用户自己定义的变量,只在用户自己的Shell环境中有效,因此又称为本地变量。在编写Shell脚本程序时,通常会设置一些特定的自定义变量,以适应程序执行过程中的各种变化,满足不同的需要。
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
代表将右边的值赋予左边
查看变量的值:echo $变量名
赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
从键盘输入内容为变量赋值
默认情况,新定义的变量只在当前的Shell环境中有效,因此成为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用。
为了使用户定义的变量在所有的子Shell环境中能够继续使用,可用过Export命令将指定的命令导出为“全局变量”。
使用export导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]…
常用运算符:
加法运算:+
减法运算:-
乘法运算:*
除法运算:/
求模(取余)运算:%
使用expr进行计算的时候,变量必须是整数,不能是字符串,也不能含小数,否则会出错。
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile,~/.bash_profile
常见的环境变量
PWD,PATH
USER,SHELL,HOME
为了在使用Shell脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念。当执行命令操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数安装从左到右的顺序依次赋值给位置变量。
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能之间为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。
$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示正常,非0值表示执行异常或出错
$0:当前执行的进程/程序名
编写一个备份操作的小脚本并进行分析,用打包命令行指定多个文件或目录,并输出相关信息。其中,新建的压缩包文件名称中嵌入秒数(从1970年1月1日至今经过的秒数),通过“date+%s”命令获取秒刻时间