编写简单的Shell脚本

  在一些复杂的Linux维护工作中,大量重复性的输入和操作不但费时费力,而且容易出错,而编写一个恰到好处的shell脚本程序,可以批量处理、自动化的完成一系列维护任务,大大减轻了管理员的负担


shell脚本基础

1. 编写第一个shell脚本

    Linux中的shell脚本是一个特殊的应用程序,介于操作系统内核和用户之间,充当了一个命令解释器的角色,负责接收用户的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果

常见的shell解释器

    可通过/etc/shells文件了解当前系统所支持的shell种类。而/bin/bash是大多数Linux默认的shell脚本

1
2
3
4
5
[root@localhost ~] # cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
……   // 省略部分内容


编写脚本文件

    将平时使用的各种Linux命令按顺序保存到一个文本文件,然后添加执行权限,这个文件就是一个shell脚本了

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # vim first.sh           //新建first.sh文件
#!/bin/bash                               //脚本声明                
# This is my first Shell-Script.          //注释信息
cd  /boot                                   // 可执行语句
pwd
ls  -lh vml*
[root@localhost ~] # . first.sh              //以下四种方式可执行脚本
[root@localhost ~] # sh first.sh
[root@localhost ~] # source first.sh
[root@localhost ~] # chmod +x first.sh
[root@localhost ~] # ./first.sh              //这种方式需要文件有x权限,而上面三种不需要


2. 重定向与管道操作

(1)重定向操作

   Linux系统使用文件来描述各种硬件、设备等资源。而用户通过操作系统处理信息的过程中,包括以下几类交互设备文件:

杨书凡00.png


    在实际Linux系统维护中,可以改变输出、输入内容的方向,不使用默认的标准输入、输出设备,这种操作称为重定向

杨书凡01.png


(2)管道操作

   管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,作为右侧命令的处理对象,同一个命令中可以有多个管道

1
2
3
4
5
6
7
[root@localhost ~] # grep “bash$" /etc/passwd
root:x:0:0:root: /root : /bin/bash
teacher:x:500:500:BENET Linux Teacher: /home/teacher : /bin/bash
 
[root@localhost ~] # grep “bash$” /etc/passwd | awk  -F:  ‘{print $1,$7}’
root   /bin/bash
teacher   /bin/bash



使用shell变量

    shell变量用来存放系统和用户需要使用的特定参数,而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过shell变量,shell程序能够提供更加灵活的功能,适应性更强

    常见shell变量的类型包括自定义变量、环境变量、位置变量、预定义变量

*自定义变量:由用户自己定义、修改和使用

*环境变量:由系统维护,用于设置工作环境

*位置变量:通过命令行给脚本程序传递参数

*预定义变量:Bash中内置的一类变量,不能直接修改


1. 自定义变量

(1)定义新的变量

    定义变量的基本*格式为“变量名=变量值”,变量名以字母或下划线开头,区分大小写,建议全大写

(2)查看和引用变量的值

   基本*格式为:echo  $变量名

1
2
3
4
5
6
7
8
[root@localhost ~] # xing=yang
[root@localhost ~] # ming=shufan
[root@localhost ~] # echo $xing
yang
[root@localhost ~] # echo $xing $ming
yang shufan
[root@localhost ~] # echo ${xing}shufan
yangshufan


(3)变量赋值的特殊操作

    赋值时使用引号:

*双引号("):当赋值内容中包含空格时,必须使用双引号,允许通过$符号引用其他变量值

*单引号('):当赋值内容中包含特殊字符时,必须使用单引号

*反撇号(`):命令替换,提取命令执行后的输出结果

1
2
3
4
5
6
7
8
9
[root@localhost ~] # xingming="yang $ming"       //双引号的应用
[root@localhost ~] # echo $xingming
yang shufan
[root@localhost ~] # xingming='yang $ming'       //单引号的应用
[root@localhost ~] # echo $xingming
yang $ming
[root@localhost ~] # aaa=`grep “bash$" /etc/passwd`       //反撇号的应用
[root@localhost ~] # echo $aaa
root:x:0:0:root: /root : /bin/bash

*    

    除了上述情况可以赋值外,还可以使用read命令进行赋值

1
2
3
4
[root@localhost ~] # read xing
yang
[root@localhost ~] # echo $xing
yang


(4)设置变量的作用范围

    默认情况下,新定义的变量只在当前shell环境中有效,称为局部变量,当进入子程序或新的子shell环境时,将无法使用。为了使用户自定义的变量在多有子shell环境中能继续使用,可以通过内部命令export将指定变量导出为“全局变量”,可同时指定多个变量名作为参数,变量名之间以逗号分隔

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # echo $xing $ming
yang shufan
[root@localhost ~] # export xing ming           //将xing、ming设为全局变量
[root@localhost ~] # bash                       //进入子shell环境
[root@localhost ~] # echo $xing $ming           //调用父shell的全局变量
yang shufan  
[root@localhost ~] # exit                       //返回原有的shell环境
 
[root@localhost ~] # export  xingming=yangshufan
[root@localhost ~] # echo $xingming           //新建一个名为xingming的全局变量
yangshufan


(5)数值变量的运算

    在bash shell环境中,只能进行简单的整数运算,不支持小数运算,通过expr命令进行,格式如下:

expr 变量1 运算符 变量2  [运算符 变量3] ...

*    常用的几种运算符如下所示:

*加法运算:+

*减法运算:-

*乘法运算:\*  不能仅使用*,否则将当成文件通配符

*除法运算:/

*求模(取余)运算:%  计算数值相除后的余数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~] # x=35
[root@localhost ~] # y=16
[root@localhost ~] # expr $x + $y    //加
51
[root@localhost ~] # expr $x - $y    //减
19
[root@localhost ~] # expr $x \* $y    //乘
560
[root@localhost ~] # expr $x / $y     //除
2
[root@localhost ~] # expr $x % $y     //取余
3
 
[root@localhost ~] # abc=`expr $x + $y `     //将运算结果赋值给变量abc
[root@localhost ~] # echo $abc
51



2. 环境变量

    环境变量由系统提前创建的一类变量,主要用户设置用户的工作环境,由Linux系统自动维护,会随着用户状态的改变而改变,可以使用env命令查看当前工作环境下的环境变量

杨书凡02.png


   PATH变量用于可执行程序的默认搜索路径

1
2
3
4
5
[root@localhost ~] # echo $PATH
/usr/lib64/qt-3 .3 /bin : /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin
[root@localhost ~] # PATH="$PATH:/root" 
[root@localhost ~] # echo $PATH
/usr/lib64/qt-3 .3 /bin : /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin : /root


3. 位置变量

    位置变量也称位置参数,使用$1、$2、$3、…、$9表示

1
2
3
4
5
6
7
8
9
[root@localhost ~] # vim xxx.sh
#!/bin/bash
sum =` expr  $1 + $2`
echo  "$1 + $2 = $sum"
 
[root@localhost ~] # . xxx.sh  12  34
12 + 34 = 46
[root@localhost ~] # . xxx.sh  10  50
10 + 50 = 60



4. 预定义变量

    预定义变量是由bash程序预先定义好的一类特殊的变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能为预定义变量赋值。使用$符号和另一个符号组合表示,下面是几个常用的预定义变量:

$#:表示命令行中位置参数的个数

$*:表示所有位置参数的内容

$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0表示执行异常

$0:表示当前执行的脚本或程序的名称


1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # cat mybak.sh
#!/bin/bash
TARFILE=beifen-` date  +%s`.tgz
tar  zcf $TARFILE $* &>  /dev/null
echo  "已执行 $0 脚本,"
echo  "共完成 $# 个对象的备份"
echo  “具体内容包括: $*” 
[root@localhost ~] # ./mybak.sh  /etc/passwd  /etc/shadow 
已执行 . /mybak .sh 脚本,
共完成 2 个对象的备份
具体内容包括: /etc/passwd  /etc/shadow




shell脚本与任务计划

    

案例:某公司使用MySQL数据库,需要对MySQL服务器中的yang库进行远程备份,每天凌晨2:30执行,每个备份为独立的.sql文件,然后压缩为.tar.gz格式,文件名嵌入执行备份时的日期和时刻

杨书凡03.png


配置步骤如下:

(1)创建一个专用的数据库备份账户ysf,允许从备份主机192.168.1.2连接到MySQL数据库,并授予对yang库的读取权限。使用备份工具mysqldump时,还需要对库设置select和lock tables权限

杨书凡04.png


(2)从MySQL客户端中测试数据库访问、查询授权是否有效,或使用备份mysqldump工具进行测试

杨书凡05.png



(3)在MySQL客户端编写MySQL备份脚本,并测试能够成功备份

杨书凡07.png

杨书凡08.png


(4)设置计划任务

杨书凡09.png

杨书凡10.png杨书凡11.png










本文转自 杨书凡 51CTO博客,原文链接:http://blog.51cto.com/yangshufan/2051929,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值