对Linux有过学习或者了解的都应该知道,Linux系统是基于 Shell 环境来执行的,作为运维也可以使用 Shell 脚本进行自动化的管理,使运维的工作更加的简化,减轻工作量。

Shell脚本说白了,就说使用shell环境来执行大量的命令,脚本中写入了批量的命令,只需要将脚本文件授权执行即可,一次性执行大量的命令

每个Linux系统所支持的shell环境的种类都在/etc/shells中存放

$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

其中/bin/bash是目前大多数Linux版本采用的默认Shell脚本环境。

简单脚本的编写

$ vim script.sh 
#!/bin/bash   # 声明使用哪种解释器执行命令
cd /boot     # 执行进入/boot目录
pwd          # 执行查看脚本当前执行的目录
ls -lh vml*  # 查看vml为前缀的文件以及目录

授予执行权限并执行

$ chmod +x script.sh   # 授权执行权限
$ ./script.sh   # 执行脚本
/boot   # cd /boot之后的pwd的输出内容
# ls -lh vml*的输出内容
-rw-r--r-- 1 root root 5.3M 7月   3 08:30 vmlinuz-5.3.0-3-amd64  

以上命令单独执行也是一样的结果

shell脚本简单结构

对于脚本内容(代码)较多,结构复杂的脚本,应添加必要的注释文字,注释文字的格式通常使用#开头

$ vim script.sh 
#!/bin/bash
# This is my first Shell-script.
cd /boot
echo "当前目录位于:"
pwd
echo "其中以vml开头的文件包括如下:"
ls -lh vml*

上述脚本第一行“#!/bin/bash”是声明脚本执行环境,其他以“#”开头的语句表示注释信息;echo命令用于输出字符串,以使脚本的输出信息更容易读懂

执行后如下所示

$ ./script.sh 
当前目录位于:
/boot
其中以vml开头的文件包括如下:
-rwxr-xr-x. 1 root root 6.0M 12月  7 2018 vmlinuz-0-rescue-804bf60793c847dea8520adcfa3c226c
-rwxr-xr-x. 1 root root 6.0M 4月  21 2018 vmlinuz-3.10.0-862.el7.x86_64

执行脚本的方式

在以上的例子中,执行脚本使用“./ 脚本文件名”的方式执行,要求文件本身必须具有x执行权限,在无法满足具有权限的条件下,也可以直接指定一个shell环境来运行脚本,或者通过内部命令source和“.”,

例如:

# 指定shell环境执行
$ sh script.sh 
当前目录位于:
/boot
其中以vml开头的文件包括如下:
-rwxr-xr-x. 1 root root 6.0M 12月  7 2018 vmlinuz-0-rescue-804bf60793c847dea8520adcfa3c226c
-rwxr-xr-x. 1 root root 6.0M 4月  21 2018 vmlinuz-3.10.0-862.el7.x86_64

# 使用内部命令'.'执行
# 执行完后可以看到,是使用当前shell来执行的,所以执行脚本后的目录是在boot目录
[root@localhost ~]# . script.sh 
当前目录位于:
/boot
其中以vml开头的文件包括如下:
-rwxr-xr-x. 1 root root 6.0M 12月  7 2018 vmlinuz-0-rescue-804bf60793c847dea8520adcfa3c226c
-rwxr-xr-x. 1 root root 6.0M 4月  21 2018 vmlinuz-3.10.0-862.el7.x86_64 
# 使用内部命令'source'执行
# 执行环境与'.'原理一样
$ source script.sh 
当前目录位于:
/boot
其中以vml开头的文件包括如下:
-rwxr-xr-x. 1 root root 6.0M 12月  7 2018 vmlinuz-0-rescue-804bf60793c847dea8520adcfa3c226c
-rwxr-xr-x. 1 root root 6.0M 4月  21 2018 vmlinuz-3.10.0-862.el7.x86_64

重定向与管道操作

由于Shell脚本“批量处理”的特殊性,大部分操作过程以静默的方式运行,不需要用户干预。因此学会提取、过滤执行信息变得非常重要。在Shell环境中有两个I/O操作:重定向、管道

重定向

Linux使用文件来描述各种硬件、设备等资源,如硬盘和分区、光盘等设备文件。用户通过操作系统处理信息的郭晨各种,包括以下几类交互设备文件。

  • 标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。如在登录时需要阻塞输入密码,可以将密码放置在一个文件中,使用标准输入导入,即可完成自动处理
  • 标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。如echo cyj > 1.txt,这样1.txt文件中就有了cyj这一行内容
  • 标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件

标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作系统进行交互,完成最基本的输入、输出操作,及从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。

在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备(键盘和显示器),这种操作就是重定向

重定向输出

重定向输出指的是将命令的正常输出结果保存到指定的文件中,重定向输出使用 “>”或“>>”操作符号,分别用于覆盖或追加文件

“>” 覆盖

$ uname -p > kernel.txt
$ cat kernel.txt 
x86_64
$ uname -r > kernel.txt 
$ cat kernel.txt 
3.10.0-862.el7.x86_64

第二次再次使用重定向到kernel.txt文件时,将之前的旧的内容覆盖为新的内容

“>>” 追加

$ uname -p > kernel.txt 
$ uname -r >> kernel.txt 
$ cat kernel.txt 
x86_64
3.10.0-862.el7.x86_64

使用追加重定向到kernel.txt文件时,将新的内容追加在最后一行

重定向输入

指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入,与输出方向相反,所以使用“<”操作符。

一般用于交互式的操作,比如设置密码时,输入密码的操作

$ echo "123.com" > pass.txt$ useradd cyj$ passwd --stdin cyj < pass.txt 

这样的操作可以省去与用户交互的过程,完成密码的自动设置

错误重定向

指的是将执行命令过程中出现的错误信息(如选项或者参数错误等)保存到指定的文件中,而不是直接显示在屏幕上。错误重定向使用“2>”操作符,其中“2”是指错误文件的编号,标准输入和标准输出的0和1是可以省略的。

错误重定向一般用于收集程序执行的错误信息,为排错提供依据;无关紧要的输出信息可以重定向到/dev/null文件中

$ tar jcf /nonedir/etc.tgz /etc/ 2> error.log
$ cat error.log 
tar: 从成员名中删除开头的“/”
tar (child): /nonedir/etc.tgz:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now

与重定向同理,“2>>”是错误追加重定向

当命令输出的结果可能既包括标准输出也包括错误信息时,可以使用重定向和错误重定向将两类输出信息分别保存到不同文件中,也可以使用“**&>**”将两类输出信息保存到同一文件。

管道

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

Shell脚本中,管道通常用来过滤关键信息

如:过滤/etc/passwd文件中以/bin/bash结尾的行

# 管道之前
$ grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
pjf:x:1000:1000:pjf:/home/pjf:/bin/bash
cyj:x:1001:1001::/home/cyj:/bin/bash

# 管道之后
$ grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
pjf /bin/bash
cyj /bin/bash

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0