简介
随着Linux操作系统在企业中应用越来越多,服务器的自动化管理也便的越来越重要 在Linux服务器的自动化维护工作中 除计划任务的设置外 Shell脚本也是非常重要一部分
Shell脚本基础
在一些复杂的Linux服务器维护工作中 大量重复性的输入和交互操作不仅费时费力 而且容易出错 编写一个恰到好处 Shell脚本程序 可以批量处理 自动化完成一系列的维护任务 减轻管理员的负担
1) 编制第一个 Shell 脚本
Linux 操作系统中Shell是一个特殊的应用程序 它介于操作系统内核和用户之间, 充当了一个"命令解释器"的角色 负责接收用户输入的操作指令(命令)并进行解释 将需要执行的操作传递给内核执行 并输出执行结果
常见的 Shell 解释器程序有很多种 使用不同的Shell程序时,其内部指令 命令行提示等方面会存在一些区别, 通过 /etc
/shells 文件可以了解当前擦操作系统 所支持的 Shell 程序种类,其中 /bin/bash 是目前大多数 Linux 版本采用的默认 Shell 程序 Bash 的全程是 Bourne Aagin Shell 是受欢迎的开源软件项目之一 .
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
1.1) 只要将平时使用的各种Linux命令按执行先后顺序保存到一个文本文件中 然后添加可在执行权限 这个文件就成为一个 Shell 脚本了 例如,执行以下操作可以创建第一个脚本文件-----first.sh
1 | [root@localhost ~]# vi first.sh | // 创建脚本 名字随意选取(first) 后缀必须是 .sh |
2 | cd /boot/ | // 进入 /boot 目录下 |
3 | pwd | // 查看工作目录 |
4 | ls -lh vml* | // 查看当前目录下 以 vml 开头的文件 |
1.2 ) 添加可执行权限 默认没有 是脚本具有可执行权限
[root@localhost ~]# chmod +x first.sh
1.3) 执行脚本文件三种方式
方法一:脚本文件路径
方法二:sh 脚本文件路径
方法三:source 脚本文件路径
实现方法:
必须有 x 权限
[root@localhost ~]# ./first.sh
[root@localhost ~]# sh /first.sh
不要求 x 权限
[root@localhost ~]# source /first.sh
输出的结果与依次单独执行这三条命令的输出结果是相同的 从而实现了"批量处理" 的自动化过程 一个合格的 Shell脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更加容易读懂 对于代码较多,结构复杂的脚本 应添加必要的注释文字
1 | [root@localhost ~]# vi /first.sh | |
2 | #!/bin/bash | // 一行特殊的脚本声明 表示此行以后的语句通过 /bin/bash 程序来解释; |
3 | # This is my first Shell-Script. | // 其他以 "#" 开头的语句表示注释信息; |
4 | echo "当前的目录位于:" | // 用于输出字符串 以使脚本的输出信息更容易读懂 |
5 | pwd | |
6 | echo "其中以vml开头的文件包括:" | |
7 | ls -lh vml* |
输出结果如下:
2.1) 重定向与管道操作
1.交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
【类型】【设备文件】【文件描述编号】【默认设备】
- 标准输入;/dev/stdin ;0 ;键盘
- 标准输出;/dev/stdout; 1 ;显示器
- 标准错误输出;/dev/stderr; 2;显示器
2.重定向操作
【类型】【操作符】【用途】
- 重定向输入 ; < ; 从指定的文件读取数据,而不是从键盘输入
- 重定向输出; > ;将输出结果保存到指定的文件(覆盖原文件)
- 重定向输出;>>; 将输出结果追加到指定的文件
- 标准错误输出;2> ;将错误信息保存到指定的文件(覆盖原文件)
- 标准错误输出;2>>; 将错误信息追加到指定的文件中
- 混合输出;&> ; 将标准输出、标准错误的内容保存到同一个文件中
------------------------------------
练习1:
# uname -p > kernel.txt
# cat kernel.txt
# uname -r >> kernel.txt
# cat kernel.txt
# echo "123456" > pass.txt
# cat pass.txt
# useradd tom
# passwd --stdin tom < pass.txt
# tar jcf /nonedir/etc.tgz /etc
# tar jcf /nonedir/etc.tgz /etc 2>error.log
# cat error.log
--------------------------
3.管道操作符号“|”
- 将左侧的命令输出结果,作为右侧命令的处理对象
- 格式:cmd1 | cmd2 [... | cmdn]
[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
以冒号:分隔,输出第1、7个字段
[root@localhost ~]# grep “bash$” /etc/passwd | awk -F: ‘{print $1,$7}’
root /bin/bash
teacher /bin/bash