Linux中的shell脚本

article/2025/7/5 14:12:00

什么是shell脚本

  • shell脚本是文本的一种
  • shell脚本是可以运行的文本
  • shell脚本的内容是由逻辑和数据组成
  • shell脚本是解释型语言

用file命令可以查看文件是否是一个脚本文件

file filename

脚本书写规范

注释

单行注释

使用#号来进行单行注释

多行注释

使用

: "

注释内容

注释内容

注释内容

"

注意:冒号后面有空格

注意

在.vimrc里面注释行时
用的是"

vim用于书写脚本的设定

ts:tab键的大小

sw:缩进大小

ai:自动缩进

et:将tab键补齐的大空格拆分成小空格

注:当你规定了tab键的大小时,再规定sw的缩进大小将不生效

用vim编辑这个配置文件 

vim ~/.vimrc

自动添加新创建的特定文件的预定内容

也是编写这个配置文件

vim ~/.vimrc

如下代码块

 第一行的意思是当新创建一个以.sh或.script时自动执行下面我们自己写的一个SHELLTITLE函数

其中函数中写的是

在第1行(linux中行数从0开始计算,所以代码中写的是0而不是1)添加上“hahahahahahahahaha”这行内容

在第2行添加上日期,其格式为年/月/日

autocmd BufNewFile *.sh,*.script call SHELLTITLE()
func SHELLTITLE()call append(0,"hahahahahahahahaha")call append(1,"# Date:             ".strftime("%Y/%m/%d"))
endfunc

检验效果

以.sh结尾的新文件会自动添加

以.script结尾的新文件

也会自动添加

如果不是以.sh或.script结尾的新文件
也是不会自动添加的

脚本执行方法

创建了一个新脚本文件

里面编写的内容

注:没有可执行权限

在没有可执行权限时

. 脚本

. 脚本

source 脚本

source 脚本

sh 脚本

sh 脚本

 

当有可执行权限时

./脚本

./脚本

 

直接执行脚本的绝对路径

脚本的绝对路径

脚本调试

写一个手残脚本

其中cat处本应该是cal

运行手残脚本

会发现被卡住了

假装排查代码眼残也没发现问题哈哈哈哈

那么我们就可以用sh -x 来执行脚本

调试脚本

sh -x 脚本

这次可以清楚的看到卡在了哪一步 

这样对我们的脚本排错有很大的作用

然后我们改一下我们的脚本

脚本在指定环境中运行

.        脚本

source        脚本

直接执行脚本的绝对路径 会直接新开bash来执行脚本

exit值

查看退出值

echo $?

退出值0为正常退出,非0值都是错误退出,不正常。

修改退出值

exit 你想要的退出值

打印文本

cat&tac

正向打印&反向打印

seq

注:只能打数字

seq 1 3
#打印1到3
seq 2 2 10
#打印2到10 步长为2
seq 1 2 10
#打印1到10 步长为2

echo

echo 123
echo "hello world"echo -n "hello world" //不换行打印echo -e "hello\tworld" //解析转义字符

printf

printf "hello vb" //不换行打印
printf "hello vb\n" //换行打印printf "3%%" //打印百分号printf "%0.1f" "3.141592653579"    //保留一位小数
printf "%0.2f" "3.141592653579"    //保留两位小数
printf "%0.3f" "3.141592653579"    //保留三位小数
printf "%.3f"  "3.141592653579"    //保留三位小数
printf "%.2f"  "3.141592653579"    //保留两位小数
printf "%.1f"  "3.141592653579"    //保留一位小数
printf "%.0f"  "3.141592653579"    //取整数

注:保留几位小数都是会四舍五入的

uniq

对于命令输出的字符冗余部分进行处理

注:只对有排序后的文件有用

vb里有实验素材,就是这些无序的数字

-d #显示重复的行
sort  -n vb  | uniq   -d
-u #显示唯一的行
sort  -n vb  | uniq   -u

-c #合并重复并统计重复个数
sort  -n vb  | uniq   -c

cut

用户对字符的截取

生成实验文件,我是从/etc/passwd中复制出来的

cut -d : -f 1 ./test

 指定分割符为 : 指定显示的列为第1列 对当前目录下的test文件作用

 指定分割符为 : 指定显示的列为第1列到第3列 对当前目录下的test文件作用 

cut -d : -f 1-3 ./test

 指定分割符为 : 指定显示的列为第3列到最后一列 对当前目录下的test文件作用

cut -d : -f 3- ./test

 指定分割符为 : 指定显示的列为第1列和第3列 对当前目录下的test文件作用

cut -d : -f 1,3 ./test

第一个字符到第四个字符

cut -c 1-4 ./test

第一个字符和第四个字符

cut -c 1,4 ./test

首字符到第八个字符

cut -c -8 ./test

第八个字符到末尾字符

cut -c 8- ./test

xargs

xargs 命令作用是将标准输入数据转换成命令行参数,能够处理管道或者标准输入并将其转换成特定命令的命令参数

原本echo的输出通过管道给touch是不能进行生成文件的操作的

所以我们需要用xargs来承接给touch(等那些不能直接接返回输出进行操作的命令)命令

echo /mnt/vb{1..3} | xargs touch

多行输入单行输出

xargs < ./vb

 指定每行输出个数

xargs -n 3  < ./vb

-n 3就是指定每行输出个数为3个 

指定分隔符

echo "vb:vb:vb" | xargs -d :

指定的是:,输出时将删除分隔符再输出 

echo "aaa:abc:cba:bba" | xargs -d a

同样如果用了字符a来进行分割的话,可以看到下方效果显示,将所有的字符a删去空位符替代并输出

用字符代替接收值

 ls /mnt/* | xargs -I word rm -fr  word

转义

在shell中有很多本身有特殊功能的字符,比如空格井号等等
如果在给变量赋值或执行命令使用时我们只想使用这些符号本身那么就需要用到转义或引用
在shell中反斜杠表示转义,每个反斜杠只能转义一个字符
在shell中单引号表示强引用,我们可以把它看作批量转义,在单引号内的所有字符被视为字符本身
在shel中双引号表示弱引用,其和单引号的区别在于不能引用(\!$)

单个转义和多个转义

单个转义

可以用\

echo #helloworldecho \#helloworld

 

当我们需要转义一串字符中含有空格断开的一个井号时

我们需要用到多个转义

"XXXXXXXXX" 

注:要想打出\,则需要用'\',而不是"\"

同样的$,需要'$'才能转义,而"$"会被注释

变量

如果没加local参数

环境级别变量只在当前运行的shell中生效,shell关闭变量被释放

用户级变量只有登录系统的指定用户,此变量才生效

系统级变量是系统中的永久设定,所有用户都可以使用,系统变量通常被保存到/etc/profile中


http://www.hkcw.cn/article/jlafOMabJI.shtml

相关文章

20250530-C#知识:抽象类、抽象方法、接口

C#知识&#xff1a;抽象类、抽象方法、接口 在开发过程中接口一般用得较多&#xff0c;程序框架往往定义一堆接口规范&#xff0c;然后程序员自己写逻辑来实现接口功能。掌握接口的知识还是很有必要的。 1、抽象类 用abstract关键字修饰的类不能用来实例化对象可以包含抽象方法…

韩国首尔一地铁车厢内遭纵火 乘客被紧急疏散

当地时间5月31日8时47分左右,韩国首尔地铁5号线一辆列车车厢内起火,乘客随后被紧急疏散。据初步调查,火灾原因为有人纵火,嫌疑人已被抓获。目前暂无人员伤亡报告。受火灾事件影响,该地铁线路部分区段一度暂停运行,首尔市交通部门10时13分通报,事故处理已经完毕,暂停运行…

跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用

JxBrowser 是 TeamDev 开发的跨平台库&#xff0c;用于在 Java 应用程序中集成 Chromium 浏览器。它支持 HTML5、CSS3、JavaScript 等&#xff0c;具备硬件加速渲染、双向 Java 与 JavaScript 连接、丰富的事件监听等功能&#xff0c;能处理网页保存、打印等操作&#xff0c;助…

聊聊网络变压器的浪涌等级标准是怎样划分的呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;聊聊网络变压器的浪涌等级标准是怎样划分的呢&#xff1f; 在和做防雷产品的客户的深度沟通网络变压器产品选型中发现&#xff1a;客户对网络变压器的浪涌等级划分也很希望有更深的了解&#xff0c;今天就这个问题和…

探索Air780EPM:N种GPIO控制LED的创新应用!

通过创新思维与实用技巧&#xff0c;本文将带你了解Air780EPM如何通过GPIO实现LED控制的N种可能&#xff0c;从简单到复杂&#xff0c;激发项目灵感。 一、GPIO直接驱动LED 1.1 适用场景 低功耗场景&#xff1a;LED电流 ≤ 5mA&#xff08;普通GPIO的驱动能力限制&#xff09;…

JS 事件循环详解

JS 事件循环详解 文章目录 JS 事件循环详解一、JS 的单线程模型与异步机制二、事件循环的核心组件1. 执行栈&#xff08;Call Stack&#xff09;2. 任务队列&#xff08;Task Queue&#xff09;3. Web APIs 三、事件循环的执行流程四、任务类型详解1. 宏任务&#xff08;Macrot…

堆遇到的stl与理论基础

目录 二叉完全搜索树是堆吗:并不是,堆比两孩子都大 1. 二叉完全搜索树的特点 2. 堆的特点 3. 两者的主要区别 4. 结论 c有swap吗 堆的向上调整和向下调整是什么 1. 堆的定义 2. 向上调整&#xff08;Heapify Up&#xff09; 操作步骤 示例&#xff08;最大堆&#x…

年度工作汇报工作总结PPT模版分享

年度工作汇报工作总结PPT模版分享&#xff1a;工作总结汇报类PPT模版https://pan.quark.cn/s/774660cc70e8

一文学会c++中的内存管理知识点

文章目录 c/c内存管理c语言动态内存管理c动态内存管理new/delete自定义类型妙用operator new和operator delete malloc/new&#xff0c;free/delete区别 c/c内存管理 int globalVar 1;static int staticGlobalVar 1;void Test(){static int staticVar 1;int localVar 1;in…

ZC-OFDM雷达通信一体化减小PAPR——直接限幅法

文章目录 前言一、直接限幅法技术1、简介2、原理 二、MATLAB 仿真1、核心代码2、仿真结果 三、资源自取 前言 在 OFDM 雷达通信一体化系统中&#xff0c;信号的传输由多个子载波协同完成&#xff0c;多个载波信号相互叠加形成最终的发射信号。此叠加过程可能导致信号峰值显著高…

【二维数组】

二维数组 需要掌握的知识二维数组与内存二维数组语法Arrays类的常用方法介绍如何实现冒泡排序 需要掌握的知识 二维数组与内存 二维数组语法 //数据类型【】【】数组; //或者 //数据类型 数组名【】【】&#xff1b; //二维数组初始化操作 int [][] scorenew int[][]{{90,85,92…

小黑大语言模型通过设计demo进行应用探索:langchain中chain的简单理解demo

chain简介 LangChain 中的 Chain 模块‌在开发大型语言模型&#xff08;LLM&#xff09;驱动的应用程序中起着至关重要的作用。Chain是串联LLM能力与实际业务的关键桥梁&#xff0c;通过将多个工具和模块按逻辑串联起来&#xff0c;实现复杂任务的多步骤流程编排。 案例 通过…

职坐标精选嵌入式AI物联网开源项目

随着嵌入式、AI与物联网技术的深度融合&#xff0c;开源生态已成为开发者构建智能硬件解决方案的核心驱动力。本文将从嵌入式实时操作系统、多模态AI数据集及物联网接入平台三大维度切入&#xff0c;系统性梳理技术选型要点与实践路径。在嵌入式领域&#xff0c;重点解析低功耗…

闻晓医考---口腔执业医师483分的复习攻略

&#x1f308;分清考试主次 &#x1f386;核心: 口外(114分) 口修(112分) 牙体牙髓(72分) &#x1f386;重点: 口预(50分) 临床医学(49分) 口组病(33分) 口解(33分) 牙周(30分) &#x1f386;次重点: 儿口(16分) 口腔黏膜(16分) 免疫&#xff08;8分&#xff09;…

火语言UI组件--幻灯片

【组件功能】&#xff1a;在有限空间内&#xff0c;循环播放同一类型的图片、文字等内容。 样式预览 基础设置 属性名称属性释义输入值类型初始索引(initialIndex)设置初始状态激活的幻灯片的索引&#xff0c;从 0 开始数字型(Number)触发方式(trigger)设置指示器的触发方式(…

矿用电液控连接器LCFB-12钢丝编织橡胶护套连接器

矿用电液控连接器LCFB-12钢丝编织橡胶护套连接器是煤矿井下综采工作面液压支架电液控制系统中的关键部件,其性能直接关系到整个液压系统的稳定性和安全性。随着智能化采矿技术的快速发展,这类连接器的技术要求和应用场景也在不断升级。本文将从产品结构、技术特点、行业应用及…

基于CAPL的DDS子消息解析- Data

1往期回顾 通过《DDS—RTPS一致性测试案例分析》一文&#xff0c;我们了解到 Data 子消息在 Data Distribution Service(DDS) 通信中扮演着至关重要的角色。它不仅负责 DDS 实体的 Simple Participant Discovery Protocol (SPDP) 发现流程&#xff0c;还参与了 Simple Endpoin…

MySQL之数据库的内嵌函数和联合查询

MySQL之数据库的内嵌函数和联合查询 一.数据库的内嵌函数1.1聚合函数1.2日期函数1.3字符串处理函数1.4 数学函数1.5其他常用的函数 二.联合查询2.1笛卡尔积2.2内连接2.3外连接2.4 自连接2.5子查询2.6合并查询 一.数据库的内嵌函数 1.1聚合函数 在MySQL中有着一类聚合函数来方…

【AUTOSAR OS】内存保护模块技术解析

一、模块总体功能概述 Os_Mprot.c 是AUTOSAR Classic Platform(CP)中内存保护模块的核心实现,主要负责验证任务(Task)和中断服务程序(ISR)对内存区域的访问权限,确保系统资源的合法使用。其核心功能包括: 内存访问权限校验:根据任务/中断所属的应用(App)信任级别(…

Docker 跨平台支持:从 Linux 到 macOS 的容器化开发实践

Docker 容器的理念是“一次构建,处处运行”,旨在解决应用程序在不同环境中部署的兼容性问题。然而,这一承诺的实现,在非原生 Linux 系统(如 macOS 和 Windows)上,需要巧妙的底层机制来支撑。 对于开发者而言,理解 Docker Desktop 在这些操作系统上的工作原理,特别是其…