如何编写实用的 shell 脚本

2023-10-24

在上一篇文章中,我们谈到了常用表达, 我们看到了如何在 sed 和 awk 中使用它们进行文本处理,我们之前讨论过Linux sed命令和awk 命令。在这个系列中,我们编写了一些小的 shell 脚本,但我们没有把事情搞混,我认为我们应该更进一步,编写一个有用的 shell 脚本。

然而,这篇文章中的脚本将帮助您增强脚本编写技能。

 

发送消息

我们将构建一个 bash 脚本,该脚本将向登录 Linux 系统的用户发送一条消息。

对于这个简单的 shell 脚本,我们只需要几个函数。我们将使用之前介绍过的一些基本命令;你可以回顾一下以前的帖子。

首先,我们需要了解登录的用户。您可以使用 who 命令来执行此操作,该命令会检索所有登录的用户。


$ who  

要发送消息,您需要用户名和他当前的终端。

然后,您需要使用 mesg 命令了解用户是否允许消息。


$ mesg  

如果结果显示“is y”,则表示用户允许消息。如果结果显示“is n”,则表示相反。

要检查任何记录的用户消息状态,请使用带有 -T 选项的 who 命令。


$ who -T  

如果您看到破折号 (-),则表示用户关闭了消息,如果您看到加号 (+),则表示相反。

要允许消息,请键入带“y”选项的 mesg 命令,如下所示:


$ mesg y  

果然,它显示“is y”,这意味着该用户允许发送消息。

当然,我们需要另一个用户能够与他通信,所以在我的例子中,我将使用另一台 PC 上的 SSH 连接到我的 PC,并且我已经与我的用户在系统上,所以我们有两个用户登录到系统。

我们来看看如何发送消息。

 

写命令

您可以使用 write 命令在使用用户名和当前终端的用户之间发送消息。

对于那些登录图形环境(KDE、Gnome、Cinnamon 或任何)的用户,他们无法接收消息。用户必须登录到终端。

我们将从我的用户 likegeeks 向 testuser 用户发送一条消息,如下所示:


$ write testuser pts/1  

键入写入命令,然后键入用户和终端,然后按 Enter 键。

当您按 Enter 键时,您可以开始输入消息。消息发送完毕后,您可以通过按 Ctrl+D 组合键发送消息,这是文件结束信号。我建议您查看有关的帖子信号和工作.

接收方可以识别哪个用户在哪个终端上发送消息。 EOF表示消息结束。

我想现在我们已经具备了构建 shell 脚本的所有部分。

 

创建发送脚本

在创建 shell 脚本之前,我们需要确定要向其发送消息的用户当前是否在系统上,您可以使用 who 命令来确定这一点。


logged=$(who | awk -v IGNORECASE=1 -v usr=$1 '{ if ($1==usr) { print $1 }exit }')  

我们使用 who 命令获取登录用户并将其通过管道传输到 awk 并检查它是否与输入的用户匹配。

最终输出为awk 命令存储在变量logging中。

然后我们需要检查变量是否包含某些内容:


if [ -z $logged ]; then

	echo "$1 is not logged on."

	echo "Exit"

	exit

fi  

我建议您阅读有关 if 语句及其使用方法的文章bash脚本.

我们测试了记录的变量以检查它是否为零。

如果为零,脚本将打印该消息,然后脚本终止。

如果用户已登录,则记录的变量包含用户名。

检查用户是否接受消息

您可以使用带有 -T 选项的 who 命令来检查用户是否允许消息。


check=$(who -T | grep -i -m 1 $1 | awk '{print $2}')

if [ "$check" != "+" ]; then

	echo "$1 disable messaging."

	echo "Exit"

	exit

fi  

请注意,我们将 who 命令与 -T 一起使用。如果用户允许消息传递,则会在用户名旁边显示一个 (+)。否则,如果他将其关闭,则会在用户名旁边显示一个 (-)。

最后,我们检查消息指示符是否不等于加号 (+)。

检查消息是否包含在内

您可以检查发件人是否键入了消息,如下所示:


if [ -z $2 ]; then

	echo "Message not found"

	echo "Exit"

	exit

fi  

获取当前终端

在发送消息之前,我们需要获取当前用户终端并将其存储在变量中。


terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')  

然后我们就可以发送消息了:


echo $2 | write $logged $terminal  

现在我们可以测试整个 shell 脚本,看看它是如何运行的:


$ ./senderscript likegeeks welcome  

让我们看看另一个 shell 窗口:

好的!您现在可以发送简单的单字消息。

发送长消息

如果您尝试发送多个单词:


$ ./senderscript likegeeks welcome to shell scripting  

它不起作用。只有我们发送了消息的第一个字。

为了解决这个问题,我们将使用移位命令与 while 循环。


shift

while [ -n "$1" ]; do

	message=$message' '$1

	shift

done  

现在,我们需要修复一件事,那就是消息参数。


echo $whole_message | write $logged $terminal  

所以现在整个脚本应该是这样的:


#!/bin/bash

logged=$(who | awk -v IGNORECASE=1 -v usr=$1 '{ if ($1==usr) { print $1 }exit }')

if [ -z $logged ]; then

	echo "$1 is not logged on."

	echo "Exit"

	exit

fi

check=$(who -T | grep -i -m 1 $1 | awk '{print $2}')

if [ "$check" != "+" ]; then

	echo "$1 disable messaging."

	echo "Exit"

	exit

fi

if [ -z $2 ]; then

	echo "Message not found"

	echo "Exit"

	exit

fi

terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')

shift

while [ -n "$1" ]; do

	message=$message' '$1

	shift

done

echo $message | write $logged $terminal  

如果你现在尝试:


$ ./senderscript likegeeks welcome to shell scripting  

惊人的!!有效。再说一遍,我不是来制作一个脚本来向用户发送消息的,但主要目标是回顾我们的 shell 脚本知识并使用我们一起学习的所有部分并了解事物如何协同工作。

 

监控磁盘空间

让我们构建一个脚本来监视最大的前十个目录。

如果将 -s 选项添加到杜命令,它将显示汇总总数。


$ du -s /var/log/  

我们使用 -S 选项来显示子目录总数。


$ du -S /var/log/  

您应该使用 sort 命令对 du 命令生成的结果进行排序,以获得最大的目录,如下所示:


$ du -S /var/log/ | sort -rn  

-n 按数字排序,-r 选项反转顺序,因此先显示较大的。

我们使用 N 命令用数字标记每一行:


sed '{11,$D; =}' |

sed 'N; s/\n/ /' |  

然后我们可以使用 awk 命令清理输出:


awk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'  

然后我们添加一个冒号和一个制表符,这样看起来就好多了。


$ du -S /var/log/ |

sort -rn |

sed '{11,$D; =}' |

# pipe the first result for another one to clean it

sed 'N; s/\n/ /' |

# formated printing using printf

awk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'  

假设我们有一个名为 MY_DIRECTORIES 的变量,其中包含两个文件夹。

MY_DIRECTORIES=”/home /var/log”

我们将迭代 MY_DIRECTORIES 变量中的每个目录,并使用 du 命令获取磁盘使用情况。

所以 shell 脚本将如下所示:


#!/bin/bash

MY_DIRECTORIES="/home /var/log"

echo "Top Ten Directories"

for DIR in $MY_DIRECTORIES; do

	echo "The $DIR Directory:"

	du -S $DIR 2>/dev/empty |
		sort -rn |
		sed '{11,$D; =}' |

		# pipe the first result for another one to clean it
		sed 'N; s/\n/ /' |

		# formated printing using printf
		awk '{printf $1 "\t" "\t" $2 "\t" $3 "\r\n"}'

done

exit  

好的!!目录 /home 和 /var/log 都在同一个报告中。

您可以过滤文件,因此您可以计算特定扩展名(如 *.log 或其他)的消耗,而不是计算所有文件的消耗。

我在这里必须提到的一件事是,在生产系统中,您不能依赖磁盘空间报告;相反,您应该使用磁盘配额。

Quota 包适合这种情况,但在这里我们正在学习 bash 脚本的工作原理。

我们在这里介绍的 shell 脚本再次是为了向您展示 shell 脚本的工作原理。在 Linux 中实现任何任务的方法有很多种。

我尝试减少帖子长度并使一切尽可能简单,希望您喜欢。

继续回来。谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写实用的 shell 脚本 的相关文章

随机推荐

  • Linux 中的超时命令

    timeout是一个命令行实用程序 它运行指定的命令 并在给定时间段后终止该命令 如果该命令仍在运行 换句话说 timeout允许您运行有时间限制的命令 这timeout命令是 GNU 核心实用程序包的一部分 几乎所有 Linux 发行版上
  • 如何在 CentOS 7 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 在大多数情况下 当在虚拟机上运行 CentOS 时 不存在交换
  • 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

    在本教程中 我们将提供有关如何在 Ubuntu 18 04 上设置 Apache 虚拟主机的分步说明 Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根目录 包含网站文件的目录 为每个站点创建单独的安
  • 如何在 Ubuntu 20.04 上安装和配置 VNC

    虚拟网络计算 VNC 是一种图形桌面共享系统 允许您使用键盘和鼠标远程控制另一台计算机 它是 Microsoft 的开源替代品远程桌面协议 RDP 本文介绍如何在 Ubuntu 20 04 上安装和配置 VNC 服务器 我们还将向您展示如何
  • 如何在 Ubuntu 18.04 上禁用防火墙

    Ubuntu 附带了一个名为 UFW 简单防火墙 的防火墙配置工具 UFW 是一个用户友好的前端 用于管理 iptables 防火墙规则 其主要目标是使管理防火墙规则更容易 或者顾名思义 不复杂 强烈建议保持防火墙启用 但是 在某些情况下
  • 如何在 Debian 9 上安装 Jenkins

    Jenkins是一个开源自动化服务器 提供了一种设置持续集成和持续交付 CI CD 管道的简单方法 持续集成 CI 是一种 DevOps 实践 团队成员定期将代码更改提交到版本控制存储库 然后运行自动化构建和测试 持续交付 CD 是自动构建
  • 如何在 Debian 10 上配置 MySQL (MariaDB) 主从复制

    MySQL 复制是将数据从一台数据库服务器 主服务器 复制到一台或多台服务器 从服务器 的过程 MySQL 支持多种复制拓扑 其中主 从拓扑是最著名的拓扑之一 其中一台数据库服务器充当主服务器 而一台或多台服务器充当从服务器 默认情况下 复
  • 如何在 Ubuntu 18.04 上安装 Ghost

    Ghost 是一个构建在 Node js 平台之上的现代源代码发布平台 它完全可定制且易于使用 使您可以以几乎零的学习曲线发布内容 在本教程中 我们将向您展示如何使用 Nginx 作为代理 免费的 Let s Encrypt SSL 证书
  • 使用 NumPy 范数计算向量和矩阵范数

    在线性代数中 范数是为向量空间中的每个向量分配严格正的长度或大小的函数 它是矢量大小的度量 从数学上来说 对于一个向量x the p 范数定义为 x p sum xi p 1 p 在本教程中 我们将使用numpy linalg norm f
  • 在 Pandas query() 中使用字符串方法:数据帧过滤

    The Pandas 中的 query 方法允许您过滤数据帧 并且当与字符串方法结合使用时 可能性变得广泛 在本教程中 您将学习如何在query 功能来细化和过滤数据 目录 hide 1 检查子字符串 str contains 2 str
  • Seaborn histplot(用直方图可视化数据)

    Seaborn 是最广为人知的数据可视化库之一 运行在Matplotlib 通过 Seaborn 我们可以渲染各种类型的绘图 并提供简单 直观且高度可定制的 API 来生成数据可视化 如果没有丰富的可视化 就很难理解数据并与数据进行交流 想
  • Kivy 教程 – 使用 Python 构建桌面 GUI 应用程序

    Kivy 是一个开源 Python 库 您可以使用它在 Windows Linux macOS Android 和 iOS 上创建应用程序 我们将讨论如何使用 Kivy 按钮 标签 回收视图 滚动视图 Kivy Canvas 和其他小部件来
  • NumPy 矩阵乘法(从理论到实际示例)

    矩阵乘法是线性代数中的基本运算 它采用一对矩阵并产生另一个矩阵 用数学术语来说 给定两个矩阵 A 和 B 乘积 AB 是通过 A 的行与 B 的列的点积来计算的 本教程旨在深入了解矩阵乘法NumPy 目录 hide 1 逐元素与矩阵乘法 2
  • Python相关矩阵教程(使用Pandas)

    在本博客中 我们将介绍一个重要的多变量数据描述性统计量 称为相关矩阵 我们将学习如何在 Python 中使用以下命令创建 绘制和操作相关矩阵Pandas 我们将讨论以下主题 目录 hide 1 What is the correlation
  • Shell 脚本编写分步教程

    在本教程中 我们将讨论 shell 脚本以及如何制作第一个 shell 脚本 它们通常被称为 shell 脚本 但我们将它们称为 Bash 脚本 因为我们将在其他 Linux shell 中使用 Bash 有 zsh tcsh ksh 和其
  • 使用 Curl 命令下载文件:综合指南

    本教程深入探讨使用以下命令下载文件的方法卷曲命令 我们将介绍 HTTP 下载 安全 HTTPS 传输 使用 FTP 服务器的基础知识 甚至浏览分段下载和速度调整等高级功能 目录 hide 1 下载到标准输出 2 下载并保存到文件 3 验证
  • 使用 to_numpy() 将 Pandas DataFrame 转换为 NumPy 数组

    The DataFrame to numpy 函数 由提供Pandas库 提供了一种将 DataFrame 转换为NumPy 数组 它返回一个 ndarray NumPy 的基本数据结构 可以使用各种 NumPy 库函数轻松操作它 当您想要
  • Linux echo 命令:超越基础知识

    The echoLinux 中的命令允许您显示文本或将数据输出到终端 它可用于各种目的 例如打印变量的值 生成格式化输出 甚至调试脚本 在终端中尝试以下命令 echo Hello world 在这里 你好 世界 被打印到终端 这echo命令
  • 掌握 Python 时间模块:综合指南

    time 模块是Python 中的标准模块 使用 Python 时 包含与时间相关的操作至关重要 time模块提供了各种与时间相关的函数和方法 可以通过导入time模块来访问 import time 除非另有说明 时间模块表示自纪元以来的时
  • 如何编写实用的 shell 脚本

    在上一篇文章中 我们谈到了常用表达 我们看到了如何在 sed 和 awk 中使用它们进行文本处理 我们之前讨论过Linux sed命令和awk 命令 在这个系列中 我们编写了一些小的 shell 脚本 但我们没有把事情搞混 我认为我们应该更