Shell脚本基础

随着Linux系统在企业中的应用愈来愈多,服务器的自动化管理也变得愈来愈重要。在Linux服务器的自动化维护工做中,除了计划任务的设置之外,Shell脚本的应用也是很是重要的一部分。做为Linux系统运维工程师,必须得要掌握Shell脚本的基本知识和编写及使用。php

shell脚本基础

在一些复杂的Linux维护工做中,大量重复性的输入和交互操做不只费时费力,并且容易出错,而编写一个恰到好处的Shell脚本程序,能够批量处理、自动化地完成一些列维护任务,大大减轻管理员的负担。python

若是使用的较老版本的Shell,建议将其更新至最新版本,由于老版的Shell出现了很是严重的错误。检测系统Shell是否存在漏洞,使用如下命令:shell

[root@localhost ~]#  env x='() { :;}; echo be careful' bash -c "echo this is ok"
this is ok                           //这种状况表示没有问题

be careful                         //这种状况就须要更新

更新方法以下:vim

[root@localhost ~]# yum -y update bash

学习测试环境,使用较老版本的Shell也没有问题,可是生产环境中,必须更新Shell!!!bash

这个问题解决以后,下面开始介绍Shell服务器

1、编制shell脚本

Linux系统中的Shell脚本是一个特殊的应用程序,它介于操做系统内核与用户之间,充当了一个“翻译官”的角色,负责接收用户输入的操做指令并进行解释,将须要执行的操做传递给内核执行,并输出执行结果。如图:
Shell脚本基础
Linux系统中常见的shell解释程序有不少种,使用不一样的shell脚本时,其内部指令、命令提示灯方面会存在一些区别。运维

[root@localhost ~]# cat /etc/shells                //查看当前系统支持哪些shell
* /bin/sh
* /bin/bash
* /sbin/nologin
* /usr/bin/sh
* /usr/bin/bash
* /usr/sbin/nologin
* /bin/tcsh
* /bin/csh
[root@localhost ~]# /bin/sh                   //切换shell
sh-4.2# exit                                           //返回上一层shell
[root@localhost ~]#

/bin/bash是目前大多数Linux版本采用的默认shell脚本。ide

shell脚本:简单来讲就是把在命令行执行的命令按顺序存放在一个文本文件中,赋予其可执行权限。那么这个文本文件就可称为一个脚本。好比:学习

[root@localhost ~]# cd /
[root@localhost /]# pwd
/                                                                     //这是两条命命输出的结果
[root@localhost ~]# vim a.sh                        //编写为本文件,以“.sh”结尾只是为了让别人知道这是一个脚本。
cd /
pwd
[root@localhost ~]# chmod +x a.sh              //服务文本文件可执行的权限
[root@localhost ~]# ./a.sh            
/                                                                     //查看脚本的执行结果和命令行执行的结果是同样

执行脚本的方法:测试

  1. “./”:(相对或绝对路径)这种方法脚本必须得须要可执行权;
  2. sh:经过/bin/sh来解释脚本;
  3. source或“.”:内部命令来加载脚本中的内容。
    前两种方法是在子shell中执行;第三种方法是在当前shell中执行!

2、重定向与管道操做

因为shell脚本的“批量处理”的特殊性,其大部分操做过程以静默的方式运行,不须要用户干预。所以学会提取、过滤执行信息变得十分重要。

1.重定向操做

用户经过操做系统处理信息的过程当中,包括三类交互设备文件:
Shell脚本基础
标准输入:从该设备接收用户输入的数据;
标准输出:经过该设备向用户输出数据;
标准错误:经过该设备报告执行出错信息。

重定向的类型分为:
Shell脚本基础

2.管道操做

管道符的做用就是将左侧的命令输出结果,做为右侧命令的处理对象。好比:

[root@localhost ~]# df -hT | grep "/$" | awk '{print $6}'
26%
//提取根分区(/)的磁盘使用率信息

3、shell变量

各类Shell环境中都使用到了“变量”的概念。Shell变量用来存放系统和用户须要使用的特定参数(值),并且这些参数能够根据用户的设定或系统环境的变化而相应变化。经过适当地使用变量,Shell程序可以提供更加灵活的功能,适应性更强。

Linux系统下常见的四种变量:

1.自定义变量

自定义变量是由系统用户本身定义的变量吗,只在用户本身的Shell环境中有效,所以,也有人称为本地变量。在编写Shell脚本程序是,用户一般会设定一些特定的自定义变量,以适应程序执行过程当中各类变化,以知足不一样的需求。

1)定义新的变量
定义变量的基本格式“变量名=变量值”,等号两边不容许有空格。变量名称须要以字母或下划线开头,名称中不要包含特殊字符(好比:+、-、*、/、……?、&、%等)。好比:

[root@localhost ~]# product=php
[root@localhost ~]# version=7.3.1

2)查看和引用变量
一般在变量名称前添加前导符“$”,能够引用一个变量的值。好比:

[root@localhost ~]# echo $product
php
[root@localhost ~]# echo $product $version
php 7.3.1

当变量名称容易和紧跟其后的其余字符相互混淆时,须要使用“{}”将变量括起来,不然将报错。好比:

[root@localhost ~]# echo $product1234                   //没有找到“product1234”这个变量
[root@localhost ~]# echo ${product}1234                //正确输出变量和字符
php1234

3)变量赋值的特殊操做

1.双引号(" "):双引号主要起界定字符串的做用,特别是当要复制的内容中包含空格是,必须以双引号括起来,其余状况双引号能够省略。好比:

[root@localhost ~]# Python=python 2.3.7
bash: 2.3.7: 未找到命令...
[root@localhost ~]# python="python 2.3.7"
[root@localhost ~]# echo $python
python 2.3.7

双引号还容许经过$符号引用其余变量值,好比:

[root@localhost ~]# SQL="SQLServer $version"
[root@localhost ~]# echo $SQL
SQLServer 1.2.3

2.单引号(' '):禁止引用其余变量值,$视为普通字符,单引号中的特殊符号都将视为普通字符,好比:

[root@localhost ~]# SQLServer='SQLserver $version'
[root@localhost ~]# echo $SQLServer
SQLserver $version

3.反撇号( ):主要用于命令替换,容许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的内容必须是能够执行的命令,不然将出错。好比:

[root@localhost ~]# ls -lh `which systemctl`
-rwxr-xr-x. 1 root root 623K 11月  7 2016 /usr/bin/systemctl

注意:使用反撇号难以子啊一行命令中实现嵌套命令替换操做,这时可使用“$()”来替代反撇号操做,解决嵌套问题。好比:

[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
//查询提供useradd命令程序的软件包所安装的配置文件位置

4.大括号({}):用来分割变量和字符;若是在变量后还有其余字符,就须要使用“{}”,{}中是变量。

4)read命令

read命令可使从键盘输入的内容为变量赋值,好比:

[root@localhost ~]# read abc
/opt/backup                                //输入给变量abc所赋的值
[root@localhost ~]# echo $abc
/opt/backup                               //查看结果

为了使交互式操做的界面更加友好,提升易用性,read命令能够加“-p”选项来设置提示信息,以便告知用户应该输入什么内容等。好比:

[root@localhost ~]# read -p "请指定存放的目录:" abcd
请指定存放的目录:/opt/backup
[root@localhost ~]# echo $abcd
/opt/backup

5)设置变量的做用范围
默认状况下,新定义的变量只能在当前Shell环境中有效,所以称为局部变量;当进入子程序或者新的Shell时,局部变量将不能使用。好比:

[root@localhost ~]# echo "$SQL $version"
SQLServer 1.2.3 1.2.3
[root@localhost ~]# /bin/sh                                   //切换一个Shell环境
sh-4.2# echo "$SQL $version"                             //找不到这样的变量
sh-4.2# exit                                                         //返回上一个Shell
[root@localhost ~]#

为了使用户定义的变量能够在全部Shell环境中继续使用,减小重复的工做,能够经过内部命令export将指定的变量导出为全局变量。用户能够同时指定多个变量名称做为参数(无需使用“$”符),变量之间用空格分割便可!

[root@localhost ~]# export SQL version
[root@localhost ~]# /bin/sh
sh-4.2# echo "$SQL $version"
SQLServer 1.2.3 1.2.3
//测试成功

6)数值变量的运算
在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。数值运算主要是经过内部命令expr进行。
经常使用的变量:

  • 加法运算:+
  • 减法运算: -
  • 乘法运算: *
  • 除法运算: /
  • 求模(取余)运算: %

好比:

[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

2.环境变量

环境变量指的处于运行须要由Linux系统提早建立好的一类变量。环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。
使用env命令能够查看当前的全部环境变量,以便了解各个变量的用途!
在Linux系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量做用域全部用户。每一个用户也有本身的环境变量配置文件(~/.bash_profile)。

3.位置变量

当执行命令行操做时,第一个字段表示命令字或脚本程序名,其他的字符串按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$一、$2…$八、$9表示。好比:

[root@localhost ~]# vim 123.sh
#!/bin/bash                                      //声明使用何种Shell
SUM=`expr $1 + $2`
echo "$1 + $2=$SUM"
[root@localhost ~]# chmod +x 123.sh
[root@localhost ~]# ./123.sh 12 34              //$1为十二、$2为34时
12 + 34=46

4.预约义变量

预约义变量是由Bash程序预先定义好的一类特殊变量,用户不可修改,预约义变量的格式:

  • $#:命令行中位置变量的个数
  • $*:全部位置变量的内容
  • $?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
  • $0:当前执行的进程/程序名

建议写在脚本中的命令,应先在命令行,执行完成确认结果以后,再写入脚本中。第一次编写脚本,可能会麻烦一些,当脚本编写完成以后,之后再有相似的需求,直接运行脚本便可!

相关文章
相关标签/搜索