导读 Linux基金会发起了LFCS认证(Linux 基金会认证系统管理员)Linux Foundation Certified Sysadmin,这是一个全新的认证体系,旨在让世界各地的人能够参与到中等水平的Linux系统的基本管理操作的认证考试中去,这项认证包括:维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。

Linux 基金会认证程序。

http://www.linuxprobe.com/wp-content/uploads/2016/07/shell_file_repair.mp4

本讲集中讲解简单的 Shell 脚本编程和文件系统修复。这两块内容都是 LFCS 认证中的必备考点。

理解终端 (Terminals)和 Shell

首先要声明一些概念。

  • Shell 是一个程序,它将命令传递给操作系统来执行。
  • Terminal 也是一个程序,允许最终用户使用它与 Shell 来交互。比如,下边的图片是 GNOME Terminal。


Gnome Terminal

启动 Shell 之后,会呈现一个命令提示符 (也称为命令行) 提示我们 Shell 已经做好了准备,接受标准输入设备输入的命令,这个标准输入设备通常是键盘。你可以参考该系列文章的 “如何在Linux上使用GNU sed等命令来创建、编辑和操作文件”来温习一些常用的命令。
Linux 为提供了许多可以选用的 Shell,下面列出一些常用的:

bash
Shell

Bash 代表 Bourne Again Shell,它是 GNU 项目默认的 Shell。它借鉴了 Korn shell(ksh) 和 C shell (csh) 中有用的特性,并同时对性能进行了提升。它同时也是 LFCS 认证中所涵盖的各发行版中默认 Shell,也是本系列教程将使用的 Shell。

sh
Shell

Bourne SHell 是一个比较古老的 shell,多年来一直都是很多类 Unix 系统的默认 shell。

ksh
Shell

Korn SHell (ksh shell) 也是一个 Unix shell,是 贝尔实验室 ( Bell Labs ) 的David Korn 在 19 世纪 80 年代初的时候开发的。它兼容 Bourne shell ,并同时包含了 C-shell 中的多数特性。
一个 shell 脚本仅仅只是一个可执行的文本文件,里边包含一条条可执行命令。

简单的 Shell 脚本编程

如前所述,一个 shell 脚本就是一个纯文本文件,因此,可以使用自己喜欢的文本编辑器来创建和编辑。你可以考虑使用 vi/vim (参考本系列 “如何安装和使用纯文本编辑器 vi/vim”它的语法高亮让我的编辑工作非常方便。
输入如下命令来创建一个名为 myscript.sh 的脚本文件:

# vim myscript.sh

shell 脚本的第一行 (著名的释伴行(shebang line)) 必须如下:

#!/bin/bash()

这条语句“告诉”操作系统需要用哪个解释器来运行这个脚本文件之后命令。
现在可以添加需要执行的命令了。通过注释,我们可以声明每一条命令或者整个脚本的具体含义。注意,shell 会忽略掉以井号 (#) 开始的注释语句。

#!/bin/bash
echo 这是关于 LFCS 认证系列的第十部分
echo 今天是 $(date +%Y-%m-%d)

编写并保存脚本之后,通过以下命令来使脚本文件成为可执行文件:

# chmod 755 myscript.sh

在执行脚本之前,我们需要说一下环境变量 ($PATH),运行:

echo $PATH

我们就会看到环境变量 ($PATH) 的具体内容:这是当输入命令时系统所搜索可执行程序的目录,每一项之间使用冒号 (:) 隔开。称它为环境变量,是因为它本是就是 shell 环境的一部分 —— 这是当 shell 每次启动时 shell 及其子进程可以获取的一系列信息。
当我们输入一个命令并按下回车时,shell 会搜索 $PATH 变量中列出的目录并执行第一个知道的实例。请看如下例子:

环境变量
假如存在两个同名的可执行程序,一个在 /usr/local/bin,另一个在 /usr/bin,则会执行环境变量中最先列出的那个,并忽略另外一个。
如果我们自己编写的脚本没有放在 $PATH 变量列出目录中的任何一个,则需要输入./filename 来执行它。而如果存储在 $PATH 变量中的任意一个目录,我们就可以像运行其他命令一样来运行之前编写的脚本了。

# pwd
# ./myscript.sh
# cp myscript.sh ../bin
# cd ../bin
# pwd
# myscript.sh


执行脚本

本章目录结构

    • if 条件语句
    • for 循环语句
    • While 循环语句
    • 综合使用
  • 文件系统排错
  • 总结

if 条件语句

无论何时,当你需要在脚本中根据某个命令的运行结果来采取相应动作时,你应该使用 if结构来定义条件。基本语法如下:

if CONDITION; then
    COMMANDS;
else
    OTHER-COMMANDS
fi

其中,CONDITION 可以是如下情形的任意一项 (仅列出常用的),并且达到以下条件时返回
true:

  • [ -a file ]

    → 指定文件存在。

  • [ -d file ]

    → 指定文件存在,并且是一个目录。

  • [ -f file ]

    → 指定文件存在,并且是一个普通文件。

  • [ -u file ]

    → 指定文件存在,并设置了 SUID 权限位。

  • [ -g file ]

    → 指定文件存在,并设置了 SGID 权限位。

  • [ -k file ]

    → 指定文件存在,并设置了“黏连 (Sticky)”位。

  • [ -r file ]

    → 指定文件存在,并且文件可读。

  • [ -s file ]

    → 指定文件存在,并且文件不为空。

  • [ -w file ]

    → 指定文件存在,并且文件可写入。

  • [ -x file ]

    → 指定文件存在,并且可执行。

  • [ string1 = string2 ]

    → 字符串相同。

  • [ string1 != string2 ]

    → 字符串不相同。

[ int1 op int2 ] 为前述列表中的一部分 (例如: -eq –> int1 与 int2 相同时返回true) ,其中比较项也可以是一个列表子项, 其中 op 为以下比较操作符。

  • -eq

    –> int1 等于 int2 时返回 true。

  • -ne

    –> int1 不等于 int2 时返回 true。

  • -lt

    –> int1 小于 int2 时返回 true。

  • -le

    –> int1 小于或等于 int2 时返回 true。

  • -gt

    –> int1 大于 int2 时返回 true。

  • -ge

    –> int1 大于或等于 int2 时返回 true。

for 循环语句

循环语句可以在某个条件下重复执行某个命令。基本语法如下:

for item in SEQUENCE; do
        COMMANDS;
done

其中,item 为每次执行 COMMANDS 时,在 SEQUENCE 中匹配到的值。

While 循环语句

该循环结构会一直执行重复的命令,直到控制命令(EVALUATION_COMMAND)执行的退出状态值等于 0 时 (即执行成功) 停止。基本语法如下:

while EVALUATION_COMMAND; do
        EXECUTE_COMMANDS;
done

其中,EVALUATION_COMMAND 可以是任何能够返回成功 (0) 或失败 (0 以外的值) 的退出状态值的命令,EXECUTE_COMMANDS 则可以是任何的程序、脚本或者 shell 结构体,包括其他的嵌套循环。

综合使用

我们会通过以下例子来演示 if 条件语句和 for 循环语句。
在基于 systemd 的发行版中探测某个服务是否在运行
先建立一个文件,列出我们想要想要查看的服务名。

# cat myservices.txt
sshd
mariadb
httpd
crond
firewalld


使用脚本监控 Linux 服务
我们编写的脚本看起来应该是这样的:

#!/bin/bash
# This script iterates over a list of services and
# is used to determine whether they are running or not.
for service in $(cat myservices.txt); do
        systemctl status $service | grep --quiet "running"
        if [ $? -eq 0 ]; then
                echo $service "is [ACTIVE]"
        else
                echo $service "is [INACTIVE or NOT INSTALLED]"
        fi
done


Linux 服务监控脚本
我们来解释一下这个脚本的工作流程
1). for 循环每次读取 myservices.txt 文件中的一项记录,每一项纪录表示一个服务的通用变量名。各项记录组成如下:

# cat myservices.txt

2). 以上命令由圆括号括着,并在前面添加美元符,表示它需要从 myservices.txt 的记录列表中取值并作为变量传递给 for 循环。
3). 对于记录列表中的每一项纪录 (即每一项纪录的服务变量),都会执行以下动作:

# systemctl status $service | grep --quiet "running"

此时,需要在每个通用变量名 (即每一项纪录的服务变量) 的前面添加美元符,以表明它是作为变量来传递的。其输出则通过管道符传给 grep。其中,-quiet 选项用于阻止 grep 命令将发现的 “running” 的行回显到屏幕。当 grep捕获到 “running” 时,则会返回一个退出状态码 “0” (在 if 结构体表示为 $?),由此确认某个服务正在运行中。
如果退出状态码是非零值 (即 systemctl status $service 命令中的回显中没有出现“running”),则表明某个服务未运行。

服务监控脚本
我们可以增加一步,在开始循环之前,先确认 myservices.txt 是否存在。

#!/bin/bash
# This script iterates over a list of services and
# is used to determine whether they are running or not.
if [ -f myservices.txt ]; then
        for service in $(cat myservices.txt); do
                systemctl status $service | grep --quiet "running"
                if [ $? -eq 0 ]; then
                        echo $service "is [ACTIVE]"
                else
                        echo $service "is [INACTIVE or NOT INSTALLED]"
                fi
        done
else
        echo "myservices.txt is missing"
fi

Ping 一系列网络或者 Internet 主机名以获取应答数据
你可能想把自己维护的主机写入一个文本文件,并使用脚本探测它们是否能够 ping 得通 (脚本中的 myhosts 可以随意替换为你想要的名称)。
shell 的内置 read 命令将告诉 while 循环一行行的读取 myhosts,并将读取的每行内容传给 host 变量,随后 host 变量传递给 ping 命令。

#!/bin/bash
# This script is used to demonstrate the use of a while loop
while read host; do
        ping -c 2 $host
done < myhosts


使用脚本 Ping 服务器
扩展阅读:

  • Learn Shell Scripting: A Guide fromNewbies to System Administrator
  • 5Shell Scripts to Learn Shell Programming

文件系统排错

尽管 Linux 是一个很稳定的操作系统,但仍然会因为某些原因出现崩溃时 (比如因为断电等),正好你有一个 (或者更多个) 文件系统未能正确卸载,Linux 重启的时候就会自动检测其中可能发生的错误。
此外,每次系统正常启动的时候,都会在文件系统挂载之前校验它们的完整度。而这些全部都依赖于 fsck 工具 ( 文件系统校验 ( file system check ) )。
如果对 fsck 进行设定,它除了校验文件系统的完整性之外,还可以尝试修复错误。fsck 能否成功修复错误,取决于文件系统的损伤程度;如果可以修复,被损坏部分的文件会恢复到位于每个文件系统根目录的 lost+found。
最后但同样重要的是,我们必须注意,如果拔掉系统正在写入数据的 USB 设备同样会发生错误,甚至可能发生硬件损坏。
fsck 的基本用如下:

# fsck [options] filesystem

检查文件系统错误并尝试自动修复
想要使用 fsck 检查文件系统,我们需要首先卸载文件系统。

# mount | grep sdg1
# umount /mnt
# fsck -y /dev/sdg1

检查文件系统错误
除了 -y 选项,我们也可以使用 -a 选项来自动修复文件系统错误,而不必做出交互式应答,并在文件系统看起来 “干净” 卸载的情况下强制校验。

# fsck -af /dev/sdg1

如果只是要找出什么地方发生了错误 (不用在检测到错误的时候修复),我们可以使用 -n 选项,这样只会将文件系统错误输出到标准输出设备上。

# fsck -n /dev/sdg1

根据 fsck 输出的错误信息,我们可以知道是否可以自己修复或者需要将问题提交给工程师团队来做详细的硬件校验。

总结

至此,系列教程的第十讲就全部结束了,全系列教程涵盖了通过 LFCS 测试所需的基础内容。
但显而易见的,本系列的十讲并不足以在单个主题方面做到全面描述,我们希望这一系列教程可以成为你学习的基础素材,并一直保持学习的热情(LCTT 译注:还有后继补充的几篇)。

我们欢迎你提出任何问题或者建议,所以你可以毫不犹豫的通过以下链接联系到我们: 成为一个 Linux 认证系统工程师 。


转载于:https://www.cnblogs.com/linux130/p/5688478.html

Shell脚本编程与文件系统修复相关推荐

  1. 【Linux命令行与Shell脚本编程】三,Linux文件系统

    Linux命令行与Shell脚本编程 第三章 Linux文件系统 文章目录 Linux命令行与Shell脚本编程 三.Linux文件系统 3.1,查看文件 3.1.1,ls 命令 选项和参数 3.1. ...

  2. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she 1.1   什么是Linux 2 1.1.1 深入探究Linux 内核 3 1.1.2 GNU 工具 6 1.1.3 Linux 桌面环 ...

  3. 《Linux命令行与shell脚本编程大全》(第三版)读书笔记

    第一部分 Linux命令行 第三章.基本的bash shell命令 bash手册 man 命令 例子: man cat 空格翻页.回车下一行.左右键看右侧(左侧)内容.q退出 info info in ...

  4. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )

    一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...

  5. linux 命令行与shell脚本编程大全

    linux 命令行与shell脚本编程大全 第一章 Linux LiveCD就是从cd读取的系统,由于没法将数据写入到cd,所以一旦重启,之前操作过后的一切数据都会丢失. 第二章 第三章 1.man手 ...

  6. 【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记

    2018深信服"醒狮计划"笔记 第3周(5.02-5.13) 课程 必修 选修 基本要求 Shell编程 <Linux命令行与Shell脚本编程大全> <Perl ...

  7. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  8. 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书是一本关于Linux 命令行与shell 脚本编程的全面教程.全书分为四部分:第一部分介绍Linuxshell 命令行:第二部分介绍shel ...

  9. Shell脚本编程基础 三 使用结构化命令

    结构化命令允许我们改变程序执行的顺序,在某些条件下执行一些命令而在其他条件下跳过另一些命令. (1)使用if-then语句 结构化命令中,最基本的类型就是if-then语句,其格式如下: if com ...

最新文章

  1. syslog打印不带等级_socket发送syslog不能获得级别
  2. 用C语言编写的简历,一份用C语言写的简历
  3. php 检查字符串类型,PHP之字符串类型与检验
  4. 小白零基础学习Java开发入门教程奉上,希望对你有所帮助!
  5. .val()数据乱码_【目标检测数据集】PASCAL VOC制作
  6. 移动端70+fps!谷歌新出高效实时视频目标检测
  7. 【Luogu】P1607庙会班车Fair Shuttle(线段树+贪心)
  8. C++基础——关于模板的技巧性基础知识(typename、成员模板、模板的模板参数)
  9. Echarts数据可视化toolbox工具框,开发全解+完美注释
  10. 解决办法:gtk_image_menu_item_set_image()菜单图标无法显示
  11. 微信朋友圈 腾讯服务器,朋友圈@微信能得一面红旗?腾讯服务器一度宕机
  12. javaScript一元四次、三次方程求根算法
  13. 计算机编码骂人,问吧骂人专用代码
  14. Web Strom 必备快捷键
  15. [HDU5956]The Elder
  16. 电脑版微信多开,安全不限制个数
  17. 雷军《小米创业思考》读书笔记
  18. 一步步教你轻松学KNN模型算法
  19. 2022 CCF形式化方法工业应用前沿分论坛暨中科国创高可信联合上海控安新品发布会顺利召开!...
  20. 【Ubuntu18.04】移动固态硬盘安装ubuntu18.04、NIVDIA、CUDA、CUDNN——01

热门文章

  1. 为什么华为a1路由器网速变慢_路由器需要每天都关吗?看完专家的解释恍然大悟...
  2. java mybatis 动态_Java-MyBatis:MyBatis 3 动态 SQL
  3. java 文件流的帮助类
  4. 蓝牙学习笔记(五)——AC692x_BLE工具make_gatt_services
  5. 简述mysql完全备份过程_【SQL】MySQL之使用mysqldump全备份及恢复过程详解_MySQL
  6. 360服务器已停止响应,对于 SQL Server 2017年累积更新 5
  7. android 8.1没声音,RingtonePreference无法在Android 8.1上添加新的铃声
  8. PAT (Basic Level) Practice1021 个位数统计
  9. PAT (Basic Level) Practice1019 数字黑洞
  10. hive数据去重测试