Linux-Shell管道命令及脚本调试-06

news2024/9/23 13:21:16

上一章我们讲了一半的管道命令,今天把剩下的讲完

1、管道命令

字符转换命令 tr, col, join, paste, expand

1.1 tr

一种可将字符进行替换、压缩、删除,可以将一组字符转换成另一组字符

格式; 

tr  [-parameter] [string1] [string2]

参数:

参数说明
-c选定字符串1中字符集的补集,即反选字符串1的补集
-d删除字符串1中出现的所有字符
-s删除所有重复出现的字符序列,只保留一个

**示例:**

# 所有的小写字符r变成大写字符R
ll | tr r R

 # -d : 删除字符串1中出现的所有字符
ll | tr -d ':' 

1.2 col

该命令是一个标准输入文本过滤器,它从标注输入设备读取文本内容,并把内容显示到标注输出设备

格式

col [-parameter]

参数:

参数说明
-b过滤掉所有的控制字符,包括RLF和HRLF
-f滤除RLF字符,但允许将HRLF字符呈现出来
-x以多个空格字符来表示跳格字符
-l<缓冲区列数>预设的内存缓冲区有128列,您可以自行指定缓冲区的大小

**示例:**  

1.3 join

将两个具有相同域的纪录给挑选出来,再将这些纪录所有的域放到一行(要整合的内容中如有相同的内容,则整合后不会重复显示)

格式

join [-parameter] file1 file2

参数:

参数说明
-a1或-a2除了显示共同域的纪录之外,-a1显示第一个文件没有共同域的纪录,-a2显示第二个文件中没有共同域的纪录
-i忽略大小写
-o设置结果显示的格式
-t改变域的分隔符
-v1或-v2不显示共同域的纪录之外,-v1显示第一个文件没有共同域的纪录,-v2显示第二个文件中没有共同域的纪录
-1或-2-1用来设置文件1连接的域,-2用来设置文件2连接的域

  **示例:**  

准备工作

 

将两个具有相同域的纪录给挑选出来,再将这些纪录所有的域放到一行

 将join1.txt和join2.txt以:分割 第一个join1.txt取第二个值,第二个join2.txt取第三个进行匹配

1.4 paste

把每个文件以列对列的方式,一列列地加以合并 ,他就是相当于把两个不同的文件内容粘贴在一起,形成新的文件

**格式:**

paste [-parameter] file1 file2

参数:

参数说明
-d默认域的分隔符是空格或tab键,设置新的域分隔符
-s将每个文件粘贴成一行
--从标准输入中读取数据

示例

paste join1.txt join2.txt

1.5 expand

转换为空白字符

 **格式:**

expand [-parameter]

参数:

参数说明
-t指定制表符所代表的空白字符的个数,而不使用默认的8。
-i不转换非空白符后的制表符
--help显示帮助信息
--version显示版本信息

举例:

将当前文件中的数据去掉空格输出到hhh.txt中

2、数据流重定向

  • 标准输入in:代码0,使用 < 或者 <<

  • 标准输出out:代码1,使用 > 或者 >>

  • 错误输出:代码2,使用 > 或者 >>

    • > 表示 写入; >>表示追加

    • <表示 读入;<<表示结束读入

 2>&1:2>&1表示将标准错误输出(stderr)重定向到标准输出(stdout)。command 2>&1,表示将command命令的标准错误输出和标准输出合并,并一起显示。

示例

读取运行shell脚本,将错误信息追加到error.log中

2代表的是将错误信息存放入日志内,如果要将正确的信息存放日志内,将2改为1 

 将错误和正确的信息都放入info.log中

 输入内容

3、脚本调试

Shell编程中,调试是一个重要的环节,它帮助我们查找脚本中的问题并进行修复。同时,合理的错误处理也是编写健壮的Shell脚本的关键 。可以理解为java中的断点调试,可以清晰的看出是如何运行的

3.1 调试工具和技巧

 在我们的shell脚本中,我们使用echo命令时,其实我们错过了一些中间结果,比如赋值,我们时看不到的,为了我们打印时可以看到变量,我们使用一下断点调试

 我们根本不清楚变量是什么变量

set -x

使用set -x命令可以在脚本执行过程中显示每个命令及其参数,非常有助于查看脚本的执行流程

只要加入我们的set -x就可以进行文本调试,

对我们的代码是有侵入性的,所以我们还有一种方式来调试

调试器:bash -x

如果脚本比较复杂,使用上述方法可能不够方便。我们可以通过在终端中运行脚本,并加上-x选项来调试整个脚本,首先需要讲set -x删除掉

set -e

使用set -e命令可以在脚本执行过程中,一旦出现非零返回值的命令,立即退出脚本。这对于快速发现错误非常有帮助。

程序出错时,停止往下运行,直接终止、

示例:

我们有一个函数,在运行脚本时调用这个文件,然后打印执行结果

结果

我们打印的 add方法的调用结果是没有进行打印,因为我们程序出错了,立刻进行停止了

原来是这样的,我们先讲set -e注释掉

 结果

3.2 错误处理

在Shell脚本中,错误处理是确保脚本在运行过程中能够适当地处理各种异常情况的关键

检查命令返回值

在脚本中执行命令后,可以通过$?变量来获取命令的返回值。通常,返回值为0表示命令成功执行,非零值表示命令执行失败。 

 我们查看当前/path/to/non_existent_dir下的文件,很显然我们是没有这个文件的,所以$?是不等于0的,$?等于零说明我们的命令是正确的,我们进行if判断,判断上一个命令是不等于0的,不等于0就打印一句话

我们下节课会将流程控制语句

#!/bin/bash

ls /path/to/non_existent_dir

if [ $? -ne 0 ]; then
  echo "Error: Directory not found."
fi

 当我们上一句命令找不到当前文件就会打印错误

我们换成可以存在的路径

使用exit命令退出脚本

在脚本中,如果发现错误或者异常情况,可以使用exit命令终止脚本的执行,并返回一个非零值表示错误

判断如果不是文件,则返回 1 ,通过$?来获取当前的返回的状态

使用trap命令捕获信号

使用trap命令可以捕获脚本接收到的信号,并执行相应的操作。这样可以在脚本执行过程中优雅地处理中断。

以下是 trap 命令的十种主要用法及其代码示例:

*用法**示例代码*
捕获并处理指定信号trap 'echo "Signal received."' INT
忽略指定信号trap '' TERM
恢复默认的信号处理方式trap - INT
设置 EXIT 信号处理函数trap 'cleanup' EXIT
在函数内部设置 RETURN 信号处理函数func() { trap 'cleanup' RETURN; ... }
清除所有已设置的信号处理函数trap - INT TERM EXIT
执行命令并在结束时恢复先前的信号处理方式trap 'cmd' EXIT; cmd
在循环中使用 trap 避免在接收到信号时终止循环while true; do trap 'break' INT; ... ; done
使用函数作为信号处理函数trap 'cleanup' INT; cleanup() { echo "Cleaning up..."; }
处理多个信号trap 'echo "Signal 1 received."' SIGUSR1; trap 'echo "Signal 2 received."' SIGUSR2

清理资源

当这个shell脚本执行完毕之后,进行清理工作 

记录错误日志

故意使用一个错误的命令,我们的trap会捕捉到移除,然后将错误信息打印到日志内

 忽略特定信号

当我们使用Ctrl+c的时候,会打印一句,并终止脚本

优雅处理脚本终止

   首先我们有清理操作,这个无论如何都会执行,还有我们的Running script,代码逻辑.我们传入一个error参数,就会执行错误的打印,并返回1 不打印成功,如果我们不传入error参数,就不会走打印错误的信息

我们没有传入error,所以先执行业务处理,成功之后,我们清理数据 

我们传入error,所以先执行业务处理,失败之后,我们清理数据 

 CentOS 7(以及大多数类Unix/Linux系统)中,信号是进程间通信的一种方式,用于通知进程某个事件的发生。这些信号具有预定义的编号和名称,并且大多数系统信号在POSIX标准中都有定义。以下是一些CentOS 7中常用的信号列表,这些信号可以通过kill命令或其他方式发送给进程:信号编号信号名称描述 SIGHUP 终端挂起或用户退出。常用于通知进程重新读取配置文件并重启。 SIGINT 中断信号,通常由Ctrl+C产生,要求进程立即停止。 SIGQUIT 退出信号,生成core dump后退出。 SIGABRT 由abort()函数产生,导致程序异常终止。 SIGKILL 强制杀死进程,该信号不能被捕获、阻塞或忽略。 SIGALRM 定时器超时。 SIGTERM 请求程序终止。这是kill命令的默认信号,可以被捕获、阻塞或忽略。 SIGCONT 如果进程已停止(例如,收到SIGSTOP信号),则继续执行。 SIGSTOP 停止进程的执行,不能被捕获、阻塞或忽略。 SIGTSTP 终端停止信号,通常由Ctrl+Z产生。 注意:这个列表并不包含所有可用的信号,只是列出了一些常用的信号。信号编号和名称在大多数Unix和类Unix系统中都是相同的,因为它们遵循POSIX标准。你可以使用kill -l命令在CentOS 7中查看所有可用的信号及其编号和名称。此外,还有一些实时信号(实时信号编号通常从34开始),但这些信号在日常使用中相对较少见,主要用于需要高精度控制的场景。对于大多数用户和应用程序来说,上述列出的信号已经足够使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs2019 QtConcurrent多线程使用方法

QtConcurrent::run(xxx) 1.打开QT Project Setting-》点击Qt Modules 2.头文件包含&#xff1a; #include <QtConcurrent/QtConcurrent> 3.使用方法&#xff1a; QFuture<void> future1 QtConcurrent::run(this, &auto_pack_line_demo::UpdateVisionComm)…

漏洞复现-Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)

1.漏洞描述 Apache Kafka 是一个开源分布式事件流平台&#xff0c;被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型应用程序。 在版本3.3.2及以前&#xff0c;Apache Kafka clients中存在一处JNDI注入漏洞。如果攻击者在连接的时候可以控制属性sasl.jaas.conf…

今是科技携手福瑞莱,共筑环境微生物检测技术创新与发展

近日&#xff0c;成都今是科技有限公司&#xff08;以下简称“今是科技”&#xff09;与福瑞莱环保科技&#xff08;深圳&#xff09;股份有限公司&#xff08;以下简称“福瑞莱”&#xff09;正式宣布达成深度战略合作。此次合作旨在将双方的优势资源与技术力量相结合&#xf…

再见,Midjourney | FLUX 彻底改变了 AI 图像游戏

Flux 刚发布一周&#xff0c;大家都疯了&#xff01; 因为真的是分不清是AI还是真实啊&#x1f3f4;‍☠️ Flux生成 Flux生成 FLUX 彻底改变了 AI 图像游戏。 02 黑深林 Black Forest Labs由Stable Diffusion模型的原班人马创立&#xff0c;旨在开发并开源高质量的图像和…

无字母数字_$ webshell之命令执行

题解分析&#xff1a; 代码案例 当然&#xff0c;这道题的限制&#xff1a; webshell长度不超过35位 不包含字母数字&#xff0c;还不能包含$和_ 所以&#xff0c;如何解决这个问题&#xff1f; shell下可以利用.来执行任意脚本 Linux文件名支持用glob通配符代替 第一点.…

Java语言程序设计基础篇_编程练习题**16.19(控制一组风扇)

**16.19&#xff08;控制一组风扇&#xff09; 编写一个程序&#xff0c;在一组中显示三个风扇&#xff0c;有控制按钮来启动和停止整组风扇&#xff0c;如图16-44所示。 习题分析 要完成这道题目&#xff0c;需要将16.18中的代码变成一个自定义面板(继承自BorderPane)&#…

考研概率论如何复习最高效?能拿满分

概率论跟哪写老师的课程&#xff1f; 推荐三个老师&#xff1a; 喻老&#xff1a;基础讲的很好 喻老的线性代数课在今年已经非常有名&#xff0c;但其实他讲授的概率论课程同样十分出色。喻老的课程特点在于讲解非常细致&#xff0c;特别适合基础较为薄弱的学生。此外&#…

MySQL练手题——case when ... then ...

一、准备工作 Create table If Not Exists Seat (id int, student varchar(255)); Truncate table Seat; insert into Seat (id, student) values (1, Abbot); insert into Seat (id, student) values (2, Doris); insert into Seat (id, student) values (3, Emerson); inser…

spark3.3.4 上使用 pyspark 跑 python 任务版本不一致问题解决

问题描述 在 spark 上跑 python 任务最常见的异常就是下面的版本不一致问题了&#xff1a; RuntimeError: Python in worker has different version 3.7 than that in driver 3.6, PySpark cannot run with different minor versions. Please check environment variables PY…

PLM软件选型攻略:10款推荐工具全面解析

本篇文章中提到的工具包括&#xff1a;PingCode、Worktile、云效、目标圈&#xff08;Goal Circle&#xff09;、Mavenlink、SAP PLM、Basecamp、Scoro、明道云、Airtable。 在现代企业管理中&#xff0c;选择合适的PLM&#xff08;产品生命周期管理&#xff09;系统对提升产品…

pytorch下载慢,如何下载到本地再去安装,本地安装pytorch

有时候按部就班的用指令去安装pytorch&#xff0c;网上很慢&#xff0c;并且往往最后可能还没有安装成功。 本次&#xff0c;介绍一下如何将这个文件先下载到本地&#xff0c;然后在去安装。 至于如何安装pytorch&#xff0c;先看一下我之前写的 深度学习环境-------pytorch…

计算机毕业设计 家电销售展示平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

数据结构----队列和栈

小编会一直更新数据结构相关方面的知识&#xff0c;使用的语言是Java&#xff0c;但是其中的逻辑和思路并不影响&#xff0c;如果感兴趣可以关注合集。 希望大家看完之后可以自己去手敲实现一遍&#xff0c;同时在最后我也列出一些基本和经典的题目&#xff0c;可以尝试做一下。…

【数据结构】六、图:2.邻接矩阵、邻接表(有向图、无向图、带权图)

二、存储结构 文章目录 二、存储结构❗1.邻接矩阵1.1无向图❗邻接矩阵-无向图代码-C 1.2有向图❗邻接矩阵-有向图代码-C 1.3带权图1.4性能分析1.5相乘 ❗2.邻接表2.1无向图2.2有向图❗邻接表-C 邻接矩阵VS邻接表邻接矩阵邻接表 ❗1.邻接矩阵 图的邻接矩阵(Adjacency Matrix) 存…

Transformer在量化投资中的应用

开篇 深度学习的发展为我们创建下一代时间序列预测模型提供了强大的工具。深度人工神经网络&#xff0c;作为一种完全以数据驱动的方式学习时间动态的方法&#xff0c;特别适合寻找输入和输出之间复杂的非线性关系的挑战。最初&#xff0c;循环神经网络及其扩展的LSTM网络被设…

云计算实训26——部署LVS负载均衡项目

LVS LVS是linux virtural server的简称——免费、开源、四层负载均衡 工作原理&#xff1a; 通过linux达到负载均衡好和linux操作系统实现高性能高可用的linux服务集群&#xff0c;具有良好的可靠性、可扩展性、可操作性、可扩展性、从而实现以低廉的成本实现最优的性能。LV…

VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔

使用 PMAlign和Fixture固定Blob工具检测孔 这个示例演示了如何使用 PMAlign 工具和 Fixture 工具来夹持一个 Blob 工具。示例代码将检测支架右上角孔的存在。当点击运行按钮时&#xff0c;将读取新图像。PMAlign 工具运行并生成一个 POSE 作为输出。POSE 是一个六自由度的变换…

Mybatis(1)

一. Mybatis概述 原本是Apache的一个开源项目叫iBatis,2010年迁移到Google Code旗下,改名为Mybatis Mybatis是一款优秀的持久层框架,是对JDBC的封装Mybatis几乎避免了JDBC所有的手动设置参数以及手动获取结果的操作Mybatis可以使用注解或XML文件来配置和映射,将数据库中的数据…

springboot发送邮箱功能的安全与加密配置?

springboot发送邮箱设置的步骤&#xff1f;springboot发信优势&#xff1f; 为了确保邮件发送过程的安全性和隐私保护&#xff0c;我们需要对 SpringBoot发送邮箱功能进行适当的安全与加密配置。AokSend将详细探讨如何在 SpringBoot项目中实现这些配置&#xff0c;以保障邮件传…

大模型面试题集锦:揭秘阿里24k Star项目背后的争议,非常详细收藏我这一篇就够了

今天分享两个 Github 上开源的不错的项目&#xff0c;以及阿里空 Github 项目的趣闻。 一、开源大模型面试题 大致看了以下&#xff0c;面试题分门别类&#xff0c;还是挺全的。包含 LLM 基础&#xff0c;分布式训练&#xff0c;推理&#xff0c;强化学习等。 二、Awesome Co…