前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解和学习基本Shell脚本和Linux文件系统疑难解答 - 第10部分

了解和学习基本Shell脚本和Linux文件系统疑难解答 - 第10部分

作者头像
用户2323866
修改2021-06-18 10:53:36
7030
修改2021-06-18 10:53:36
举报
文章被收录于专栏:技术派技术派

了解端子和外壳

让我们首先澄清几个概念。

  1. shell是一个程序,它接受命令并将其提供给要执行的操作系统。
  2. 终端是一个程序,允许我们作为最终用户与shell进行交互。 终端的一个示例是GNOME终端,如下图所示。
Gnome终端
Gnome终端

Gnome终端

当我们首次启动一个shell时,它提供一个命令提示符(也称为命令行),告诉我们shell已经准备好开始接受来自其标准输入设备的命令,这通常是键盘。

您可能需要参考的另一篇文章在本系列( 使用命令来创建,编辑和操作文件-第1部分 ),审查了一些有用的命令。

Linux为shell提供了一系列选项,以下是最常见的选项:

bash壳

巴什表示称作Bourne Again shell是GNU项目的默认外壳。 它包含来自Korn shell(ksh)和C shell(csh)的有用功能,同时提供了几个改进。 这是LFCS认证中涵盖的发行版使用的默认shell,它是我们将在本教程中使用的shell。

sh壳

Bourne shell的是最古老的外壳,因此一直是许多类UNIX操作系统多年的默认外壳。

ksh壳

Korn shell是由大卫·科恩在贝尔实验室在80年代初开发的Unix外壳。 它与Bourne shell向后兼容,并且包含C shell的许多功能。

shell脚本不再是一个文本文件,它变成一个可执行程序,它组合由shell一个接一个执行的命令。

基本Shell脚本

如前所述,shell脚本作为纯文本文件诞生。 因此,可以使用我们首选的文本编辑器创建和编辑。 你可能要考虑用vi /米(参考vi编辑器的使用-第2部分本系列的),它具有语法高亮为您提供方便。

键入以下命令以创建名为myscript.sh的文件,然后按Enter键。

代码语言:javascript
复制
# vim myscript.sh

shell脚本的第一行必须是如下(也称为家当 )。

代码语言:javascript
复制
#!/bin/bash

它“ 告诉 ”操作系统应该用于运行如下文解释的名称。

现在是时候添加我们的命令。 我们可以通过添加注释来澄清每个命令或整个脚本的目的。 需要注意的是shell忽略了那些有井号#(解释性评论)开始的行。

代码语言:javascript
复制
#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

一旦脚本被编写和保存,我们需要使它可执行。

代码语言:javascript
复制
# chmod 755 myscript.sh

在运行我们的脚本之前,我们需要说一下$ PATH环境变量中的几句话。 如果我们跑,

代码语言:javascript
复制
echo $PATH

在命令行中,我们将看到$ PATH中的内容当我们进入一个可执行程序的名字被搜索目录的冒号分隔的列表。 它被称为环境变量,因为它是shell环境的一部分 - 当shell首次启动时,一组可用于shell及其子进程的信息。

当我们输入一个命令,然后按在$ PATH变量中列出的所有目录输入,shell搜索并执行找到的第一个实例。 让我们看一个例子,

Linux环境变量
Linux环境变量

环境变量

如果有两个可执行文件名称相同的,一是在/ usr / local / bin目录 ,另一个在/ usr / bin中 ,一个在第一个目录将首先执行,而其他将被忽略。

如果我们还没有保存在里面的$ PATH变量中列出的目录之一,我们的脚本,我们需要追加./到文件名,以执行它。 否则,我们可以像使用常规命令那样运行它。

代码语言:javascript
复制
# pwd
# ./myscript.sh
# cp myscript.sh ../bin
# cd ../bin
# pwd
# myscript.sh
在Linux中执行脚本
在Linux中执行脚本

执行脚本

条件

每当你需要指定动作不同的课程采取在shell脚本,作为一个命令的成功或失败的结果,您将使用if结构来定义这样的条件。 其基本语法是:

代码语言:javascript
复制
if CONDITION; then 
COMMANDS;
else
OTHER-COMMANDS 
fi

WHERE 条件可以是以下(只有最常见的情况在这里被引用)之一,计算结果为真时:

  1. [-a文件]→文件存在。
  2. [-d文件]→文件存在且是一个目录。
  3. [-f文件]→文件存在且是一个普通文件。
  4. [-u文件]→文件存在和它的SUID(设置用户ID)位设置。
  5. [-g文件]→文件存在和它的SGID位。
  6. [-k文件]→文件存在,并且其粘位。
  7. [-r文件]→文件存在并且可读。
  8. [-s文件]→文件存在且不是空的。
  9. [-w文件]→文件存在且可写。
  10. 如果文件存在且可执行[-x文件]是真实的。
  11. [字符串1 =字符串2]→字符串相等。
  12. [字符串1!=字符串2]→字符串不相等。

[INT1 INT2运]应该是前面的列表的一部分,而后面的项目(例如, 当量- >是真的如果int1等于int2)应该是一个“ 孩子 ”名单[INT1 INT2运]其中op是以下比较运算符之一。

  1. 当量- >如果int1等于int2是真实的。
  2. -ne - > true,如果INT1不等于int2。
  3. -lt - > true,如果int 1小于INT2。
  4. -le - >真如果int1小于或等于int2。
  5. -gt - > true,如果INT1比INT2更大。
  6. -ge - >真如果int1大于或等于int2。
循环

此循环允许为值列表中的每个值执行一个或多个命令。 其基本语法是:

代码语言:javascript
复制
for item in SEQUENCE; do 
COMMANDS; 
done

其中, 项目是表示每次迭代过程中序列中的每个值的通用变量。

循环

该循环允许执行一系列重复命令,只要控制命令执行退出状态等于零(成功)。 其基本语法是:

代码语言:javascript
复制
while EVALUATION_COMMAND; do 
EXECUTE_COMMANDS; 
done

哪里EVALUATION_COMMAND可以是任何命令(多个)可以与一个成功(0)或失败(0以外状态退出,并且EXECUTE_COMMANDS可以是任何程序,脚本或shell结构,包括其它嵌套循环。

把它放在一起

我们将演示使用if结构和for循环与以下示例。

确定服务是否正在基于systemd的发行版中运行

让我们创建一个包含我们想要一目了然的服务列表的文件。

代码语言:javascript
复制
# cat myservices.txt
sshd
mariadb
httpd
crond
firewalld
监视Linux服务的脚本
监视Linux服务的脚本

监视Linux服务的脚本

我们的shell脚本应该看起来像。

代码语言:javascript
复制
#!/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服务监控脚本
Linux服务监控脚本

Linux服务监控脚本

让我们解释一下脚本的工作原理。

1)for循环读取文件myservices.txt在时间列表的一个元素。 该单个元素由名为service的通用变量表示。 LIST填充有输出,

代码语言:javascript
复制
# cat myservices.txt

2)上述命令是用括号括起来,并用一个美元符号开头,表明它进行评估,以填充,我们将遍历列表。

3)对于列表中的每个元素(即服务变量的每个实例),下面的命令将被执行。

代码语言:javascript
复制
# systemctl status $service | grep --quiet "running"

这个时候我们需要一个美元符号先于我们的通用变量(代表列表中的每个元素),以表明它是一个变量,因此应该使用它在每次迭代中值。 然后将输出通过管道传递到grep。

-quiet标志用于防止grep的从显示在屏幕上,其中的字的运行出现的线条。 当发生这种情况,上面的命令返回0退出状态(由$表示在if结构),从而验证该服务正在运行。

不是0的退出状态(这意味着这个在运行状态systemctl $服务的输出未找到)表示该服务没有运行。

服务监控脚本
服务监控脚本

服务监控脚本

我们可以更进一步,甚至试图进入循环之前检查myservices.txt的存在。

代码语言:javascript
复制
#!/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一系列网络或互联网主机以获取回复统计信息

你可能要保持主机列表的文本文件,并使用脚本现在,然后确定每个它们是否可ping与否(随意更换myhosts的内容,并亲自尝试)。

读出的shell内置命令告诉while循环逐行读取myhosts线和分配每行变量的主机,然后传递给ping命令的内容。

代码语言:javascript
复制
#!/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服务器的脚本
Ping服务器的脚本

Ping服务器的脚本

另请参阅

  1. 学习Shell脚本:从新手到系统管理员的指南
  2. 5 Shell脚本学习Shell编程

文件系统疑难解答

虽然Linux是一个非常稳定的操作系统,如果它由于某种原因(例如,由于断电)崩溃,您的一个(或多个)文件系统将不会被正确卸载,因此将自动检查错误,当Linux重新启动。

此外,每次系统在正常引导期间引导时,它始终在安装文件系统之前检查文件系统的完整性。 在这两种情况下,这是使用的fsck命名工具(“ 文件系统检查 ”)执行。

fsck将不仅检查文件系统的完整性,而且还尝试修复损坏的文件系统,如果指示这样做。 根据损伤的严重程度,fsck可能成功或不成功; 当它,恢复文件的部分被放置在lost + found目录,位于每个文件系统的根目录。

最后但并非最不重要的是,我们必须注意,如果我们尝试在操作系统仍在写操作系统时删除USB驱动器,甚至可能导致硬件损坏,也可能发生不一致。

fsck的基本语法如下:

代码语言:javascript
复制
# fsck [options] filesystem
检查文件系统是否有错误并尝试自动修复

为了使用fsck检查文件系统,我们必须首先卸载它。

代码语言:javascript
复制
# mount | grep sdg1
# umount /mnt
# fsck -y /dev/sdg1

检查文件系统错误

除了-y标志,我们可以使用-a选项来自动修复文件系统,而无需询问任何问题,并迫使即使文件系统看起来干净的检查。

代码语言:javascript
复制
# fsck -af /dev/sdg1

如果我们只找出什么是错的(但不尝试进行任何修复暂时)有兴趣,我们可以使用-n选项运行fsck,将输出文件系统问题,到标准输出。

代码语言:javascript
复制
# fsck -n /dev/sdg1

根据fsck输出中的错误消息,我们将知道我们是否可以尝试自己解决问题或将其升级到工程团队以执行进一步的硬件检查。

概要

我们在这个10系列文章 ,其中有试图掩盖要通过考试LFCS所需的基本能力域的结尾已经到达。

由于显而易见的原因,不可能在任何单个教程中涵盖这些主题的每一个方面,这就是为什么我们希望这些文章让你在正确的道路上自己尝试新的东西,并继续学习。

如果您有任何问题或意见,他们总是欢迎 - 所以不要犹豫,通过下面的表格让我们一条线!

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 了解端子和外壳
    • bash壳
      • sh壳
        • ksh壳
        • 基本Shell脚本
          • 条件
            • 循环
              • 循环
                • 把它放在一起
                • 文件系统疑难解答
                • 概要
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档