当前位置: 首页 > news >正文

编写Bash脚本程序从记录文件中提取history命令的优化,再介绍linux bash语法和结构

目        录

一、引言

二、脚本代码实现

三、bash语法和结构

(一)基本语法

1、脚本开始与结束

2、注释

3、变量

4、数据类型

5、控制结构

6、循环控制

7、函数

8、算术运算

9、算术操作符和逻辑操作符

(二)命令相关

1、命令执行

2、命令的执行顺序

3、命令的执行优先级

4、命令的返回值

5、命令替换

6、输入/输出重定向

7、信号处理

8、 命令的退出状态

9、 命令的参数

10、命令的返回值

(三)内置函数和变量

1、内置变量

2、内置函数:

(四)其他

1、文件测试操作符

2、参数扩展


一、引言

       前面写了一篇文章:History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令),有伙伴试过了,想知道,输出的命令列表能否进行排序,方便查看?

       当然是可以的,本节就介绍一下如何实现。

二、脚本代码实现

       其他的不多说了,直接上代码:

#!/bin/bash  # 检查输入参数  
if [ "$#" -ne 1 ]; then  echo "Usage: $0 <path.bash_history_file>"  echo “用法:$0  带路径的文件名”exit 1  
fi  # 检查记录文件是否存在  
if [ ! -f "$1" ]; then  echo "Error: File $1 does not exist."  exit 1  
fi  # 创建一个临时文件来存储格式化的历史记录  
tempfile=$(mktemp)  # 读取.bash_history文件,将时间戳和linux 命令存储到临时文件中  
while IFS= read -r line; do  # 检查行是否以#开头,如果是,则认为是时间戳  if [[ $line =~ ^\#[0-9]+$ ]]; then  timestamp=${line:1}  else  # 将时间戳和命令写入临时文件  echo "$timestamp $line" >> "$tempfile"  fi  
done < "$1"  # 按时间戳排序临时文件中的内容  
sort -n -k 1,1 "$tempfile" | cut -d ' ' -f 2- | cat -n | sed 's/^\s*//'  # 最后删除临时文件  
rm -f "$tempfile"

        其他操作请参考前面的文章:History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令)

三、bash语法和结构

        Bash(Bourne Again SHell)是Linux和其他类Unix系统中默认的shell,它提供了脚本编程语言的功能。下面详细介绍Bash脚本的基本语法和结构。

(一)基本语法

1、脚本开始与结束

        脚本通常以#!/bin/bash开头,这被称为shebang,它告诉系统使用bash来执行这个脚本。

        脚本结束没有特定的标记,但通常以一个非执行的空白行结束,这样可以使脚本结构更清晰。

2、注释

        在脚本中,#符号用于注释,它之后的所有内容直到行尾都会被视为注释。

3、变量

        变量名以字母或下划线开头,后面可以跟字母、数字或下划线。

        变量赋值不需要使用等号两边有空格,例如:name="John"。

        读取用户输入到变量中:read name。

4、数据类型

        字符串:由零个或多个字符组成的有序字符序列。

        整数:没有小数点的数字。

5、控制结构

        if...then...else...fi:用于基于条件执行不同的操作。如下:

if [ condition ]; then 

    # commands 

elif [ condition ]; then 

    # commands 

else 

    # commands         

fi`

        for...in...do...done:用于循环遍历一组值。

for variable in value1 value2 ...; do 

    # commands using $variable 

done

        while...do...done:只要给定的条件为真,就会重复执行一系列命令。

while [ condition ]; do 

    # commands 

done

6、循环控制

        break:跳出当前循环。

        continue:跳过当前循环的剩余部分,进入下一次循环。

7、函数

        通过名字调用一段代码的复用方式。定义函数时使用function_name() { ... }的格式。函数参数通过位置来传递。

8、算术运算

        使用expr或双括号(( ))进行算术运算。例如,expr 2 + 3 或 (( a = 2 + 3 ))。

9、算术操作符和逻辑操作符

        例如,+、-、*、/ 用于算术运算,==、!= 用于字符串比较,&&、|| 用于逻辑操作。

控制结构中的模式匹配:使用 [[ ... ]] 进行模式匹配,例如 [[ $variable == pattern ]]。

数组:Bash 支持数组,可以通过索引访问元素。

(二)命令相关

1、命令执行

        使用分号(;)或换行符来分隔命令。例如,echo "Hello"; echo "World" 或 `echo "Hello"

World"`。

2、命令的执行顺序

        Bash脚本会按照从上到下的顺序执行命令,你可以使用 && 和 || 控制命令的执行顺序。

3、命令的执行优先级

        使用括号可以改变命令的执行优先级。

4、命令的返回值

        每个命令执行后都会返回一个状态码,可以使用 $? 获取上一个命令的返回值。状态码0表示成功,非0表示有错误发生。

5、命令替换

        可以使用反引号()或$()来执行命令并将输出替换到当前位置。例如,echo "Today is $(date)"`。

6、输入/输出重定向

        使用尖括号(>)和(>>)来重定向标准输出和标准错误输出到文件。例如,echo "Hello" > file.txt。使用尖括号(<)来重定向标准输入从文件。例如,cat < file.txt。

7、信号处理

        可以使用 trap 命令捕获和处理信号。

8、 命令的退出状态

        每个命令执行后都会返回一个退出状态码,0通常表示成功,非0表示有错误发生。你可以使用特殊变量 `$?` 来获取上一个命令的退出状态码。

9、 命令的参数

        在脚本中,你可以通过特殊变量 `$0`、`$1`、`$2` 等来获取传递给脚本或函数的参数。例如,在函数中,你可以使用 `$1` 来获取第一个参数的值。另外,你也可以使用特殊变量 `$#` 来获取传递给脚本或函数的参数的数量。

10、命令的返回值

        命令执行后返回的状态码用于判断命令是否成功执行。0表示成功,非0表示有错误发生。可以通过特殊变量$?获取上一个命令的返回值。

(三)内置函数和变量

1、内置变量

        例如 $#、$*、$1、$2 等用于获取位置参数的信息;$? 用于获取上一个命令的返回值;`` 用于获取当前脚本的进程ID等。

2、内置函数:

        例如 echo、read、test 等,这些函数提供了基本的输入输出和测试功能。

(四)其他

1、文件测试操作符

用于检查文件或目录的存在、权限、类型等属性。例如,-e 检查文件或目录是否存在,-f 检查是否为常规文件,-d 检查是否为目录等。

if [ -e "/path/to/file" ]; then 

    echo "File exists" 

fi

2、参数扩展

例如 ${variable#pattern} 可以删除变量值的最前面与模式匹配的部分。

        

        以上是Bash脚本的基本语法和结构的概述,Bash脚本还有很多高级特性和用法,可以参考相关的文档和教程进行深入学习。希望这些信息,可以帮助您更好地了解Bash脚本的语法和结构!

相关文章:

编写Bash脚本程序从记录文件中提取history命令的优化,再介绍linux bash语法和结构

目 录 一、引言 二、脚本代码实现 三、bash语法和结构 &#xff08;一&#xff09;基本语法 1、脚本开始与结束 2、注释 3、变量 4、数据类型 5、控制结构 6、循环控制 7、函数 8、算术运算 9、算术操作符和逻辑操作符 &#xff08;二&#xff09;命令相关…...

Python中Numba库装饰器

一、运行速度是Python天生的短板 1.1 编译型语言&#xff1a;C 对于编译型语言&#xff0c;开发完成以后需要将所有的源代码都转换成可执行程序&#xff0c;比如 Windows 下的.exe文件&#xff0c;可执行程序里面包含的就是机器码。只要我们拥有可执行程序&#xff0c;就可以随…...

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中&#xff0c;使用 aop 增强&#xff0c;不仅可以很优雅地扩展功能&#xff0c;还可以让一写多用&#xff0c;避免写重复代码&#xff0c;例如&#xff1a;记录接口耗时&#xff0c;记录接口日志&#xff0c;接口权限&…...

100天精通鸿蒙从入门到跳槽——第16天:ArkTS条件渲染使用教程

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…...

【Linux C | 进程】Linux 进程间通信的10种方式(1)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系&#xff0c;这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的&#xff0c;Mybatis中存在两级缓存。分别是一级缓存(会话级)&#xff0c;和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…...

看图说话:Git图谱解读

很多新加入公司的同学在使用Git各类客户端管理代码的过程中对于Git图谱解读不太理解&#xff0c;我们常用的Git客户端是SourceTree&#xff0c;配合P4Merge进行冲突解决基本可以满足日常工作大部分需要。不同的Git客户端工具对图谱展示会有些许差异&#xff0c;以下是SourceTre…...

linux新增用户,指定home目录和bash脚本且加入到sudoer列表

前言 近3年一直用自动化脚本&#xff0c;搞得连useradd命令都不会用了。哈哈。 今天还碰到一个问题&#xff0c;有个系统没有‘useradd’和‘passwd’命令&#xff0c;直接蒙了。当然直接用apt install就能安装&#xff0c;不然还得自己编译折腾一会。新建用户 useradd -d /h…...

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv3的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv3检测器&#xff0c;来对YOLOv3有…...

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…...

C语言2024-1-27练习记录

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//int main() //{ // char c[15] { I, ,a,n,d, ,you,. }; // int i; // for(i 0; i < 15; i) //这个地方有几个地方需要注意一下&#xff0c;首先变量指定之后必须要加上英文状态下的分号 // printf("%c&q…...

深入解析HTTPS:安全机制全方位剖析

随着互联网的深入发展&#xff0c;网络传输中的数据安全性受到了前所未有的关注。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;为数据在客户端和服务器之间的传输提供了加密和身份验证&#xff0c;从而确保了数据的机密性、完整性和身份真实性。本文将详细探讨HTTPS背后的…...

【197】JAVA8调用阿里云对象存储API,保存图片并获取图片URL地址。

实际工作中&#xff0c;需要用阿里云对象存储保存图片&#xff0c;并且在上传图片到阿里云对象存储服务器后&#xff0c;获取图片在阿里云对象存储服务器的URL地址&#xff0c;以便给 WEB 前端显示。 阿里云对象存储上传图片的工具类 package zhangchao;import com.aliyun.os…...

2024.1.24 C++QT 作业

思维导图 练习题 1.提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 #include <iostream> #include <string.h> #include <array> using namespace std;int main() {string str;cout << "…...

jenkins部署过程记录

一、jenkins部署git链接找不到 原因分析&#xff1a; 机器的git环境不是个人git的权限&#xff0c;所以clone不了。Jenkins的master节点部署机器已经部署较多其他的job在跑&#xff0c;如果直接修改机器的git配置&#xff0c;很可能影响到其他的job clone 不了代码&#xff0c…...

JS-策略设计模式

设计模式&#xff1a;针对特定问题提出的简洁优化的解决方案 一个问题有多种处理方案&#xff0c;而且处理方案随时可能增加或减少比如&#xff1a;商场满减活动 满50元减5元满100元减15元满200元减35元满500元减100元 // 满减金额计算函数 function count(money, type) {if …...

漏洞复现-EduSoho任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…...

「QT」QString类的详细说明

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「...

微信小程序-04

rpx&#xff08;responsive pixel&#xff09;是微信小程序独有的&#xff0c;用来解决屏适配的尺寸单位。 import 后跟需要导入的外联样式表的相对路径&#xff0c;用 ; 表示语句结束。 定义在 app.wxss 中的样式为全局样式&#xff0c;作用于每一个页面。 在页面的 .wxss 文…...

什么是数据库的三级模式两级映象?

三级模式两级映象结构图 概念 三级模式 内模式&#xff1a;也称为存储模式&#xff0c;是数据物理结构和存储方式的描述&#xff0c;是数据在数据库内部的表示方式。定义所有的内部记录类型、索引和文件组织方式&#xff0c;以及数据控制方面的细节。模式&#xff1a;又称概念…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...