Shell 脚本

article/2025/8/28 8:38:12

注:文章参考《鸟哥的linux私房菜》、通义千问AI产品

认识 Shell

Linux 中的 Shell 就是 linux 内核的一个外层保护工具,并负责完成用户与内核之间的交互。

Shell 可以分为以下几类:

  • Bourne Shell (简称 sh)
  • C Shell(简称 csh)
  • Korn Shell(简称 ksh)
  • Bourne Again Shell(简称 bash)

其中目前 bash 最为流行。

对于 shell 脚本,其实就是把脚本的内容放到 shell 环境中运行,和 windows 的 批处理文件类似

Shell 变量

在这里插入图片描述

环境变量

常用 shell 环境变量
在这里插入图片描述

局部变量
#!/bin/bash 
localVar="I am a local variable" 
echo $localVar # 输出: I am a local variable bash 

这个脚本中定义的变量无法再其他脚本文件中访问

位置变量

在这里插入图片描述

#!/bin/bash 
echo "The first parameter is $1" 
echo "The second parameter is $2" 
echo "The name of the script is $0" # 执行: ./myscript.sh arg1 arg2 
# 输出: # The first parameter is arg1 
# The second parameter is arg2 
# The name of the script is ./myscript.sh

编写 Shell 脚本

Hello World!

在这里插入图片描述

#!/bin/bash 在宣告这个 script 使用的 shell 名称,这个文件内的语法是 bash 的语法

接着以 # 开头的均为注释,在 shell 脚本中 # 代表行注释

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
这两行是在配置环境变量

echo -e “Hello World! \a \n”
这一行表示待会执行 shell 脚本时,屏幕上会显示 Hello World!,
相当于使用标准输出输出Hello World! 这个字符串

echo命令参数详解
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上图展示了两种执行 shell 脚本的方式,创建 shell 脚本默认没有执行权限

第一种方式:sh hello.sh
这种方式不需要 hello.sh 具有执行权限

第二种方式:修改 hello.sh 的权限为创建者可执行,其他用户只读
然后执行 ./hello.sh

第三种方式: source hello.sh
这种方式也可以执行 shell 脚本,但会因为写了 exit 0 退出整个 shell

这三种方式均可以执行 shell 脚本

source, sh script, ./script 的执行方式差异

sh script 和 ./script 相当于在父 shell 中开了个子程序
在这里插入图片描述

这种方式在 shell 脚本中创建的任何变量不会保存到父程序中

source hello.sh
在这里插入图片描述

这种方式是直接将脚本放在当前shell 环境中运行,脚本中创建的变量会保存到父程序中

测试
在这里插入图片描述

从上图可以看出执行方式的差异
这也是为啥你不登出系统而要让某些写入 ~/.bashrc 的设置生效时,需要使用“ source ~/.bashrc ”而不能使用“ bash ~/.bashrc ”是一样的

输入输出语句

在这里插入图片描述

read命令是从标准输入读入一行数据,然后赋值给一个或多个变量
read 命令相关参数
在这里插入图片描述

read -p "Please input your first name: " firstname # 提示使用者输入
这里是先提示 "Please input your first name: "
用户输入后将值赋给 firstname

read -p "Please input your last name: " lastname # 提示使用者输入
这里是先提示 "Please input your last name: "
用户输入后将值赋给 lastname

echo -e “\nYour full name is: ${firstname} ${lastname}” # 结果由屏幕输出
这里${firstname} 和 ${lastname} 是 shell 脚本中取出一个变量的值的方法

创建前天、昨天、今天的日期文件

在这里插入图片描述

filename=${fileuser:-“filename”} # 开始判断有否配置文件名
这一行是一种默认配置,比如用没输入文件名,那filename就会是后面的字符串"filename"
在这里插入图片描述

date1=$(date --date=‘2 days ago’ +%Y%m%d) # 前两天的日期
date2=$(date --date=‘1 days ago’ +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期

这里$()是截取输出给左边的变量

date 是 Linux/Unix 系统中用于显示或设置系统时间与日期的命令。
常用格式化选项
在这里插入图片描述

其他参数
在这里插入图片描述

–date= 后面可以写以下内容
在这里插入图片描述

相对时间
在这里插入图片描述

具体时间
在这里插入图片描述

时间偏移
在这里插入图片描述

自然语言
在这里插入图片描述

执行shell 脚本
在这里插入图片描述

四则运算

在这里插入图片描述

推荐使用var=$((运算内容)) 这种格式进行四则运算,容易记忆

> 用 echo 输出时,&gt 会输出为 >

执行 shell 脚本
在这里插入图片描述

条件分支语句

if 条件语句

在这里插入图片描述

case 分支语句

在这里插入图片描述

案例
在这里插入图片描述

test 指令

在这里插入图片描述

比如这一行命令
-e 判断文件名是否存在
这一行相当于伪代码:

if test -e /dmtsai is true: echo "exist" 
else: echo "Not exist"

可用参数
在这里插入图片描述

在这里插入图片描述

利用判断符号 []
注意在 [ 和 ] 两侧加上空格
在这里插入图片描述

在这里插入图片描述

循环语句

for 循环

语法:for…do…done

案例一
在这里插入图片描述

案例二
在这里插入图片描述

案例三
在这里插入图片描述

while循环

语法:while…do…done

案例
在这里插入图片描述

until

语法:until…do…done

案例
在这里插入图片描述

函数 Function

语法:function 函数名(){}

function里面的 return 只能返回状态码(只能是 0~255)
推荐使用 echo 输出结果,然后使用$() 获取结果

案例
在这里插入图片描述

习题(答案在后面)

第一题

请创建一支 script ,当你执行该 script 的时候,该 script 可以显示:

  1. 你目前的身份 (用 whoami )
  2. 你目前所在的目录 (用 pwd)
第二题

让使用者输入一个数字,程序可以由 1+2+3… 一直累加到使用者输入的数字为止。

第三题

撰写一支程序,他的作用是: 1.) 先查看一下 /root/test/logical 这个名称是否存在; 2.) 若不存在,则创建一个文件,使用 touch 来创建,创建完成后离开; 3.) 如果存在的话,判断该名称是否为文件,若为文件则将之删除后创建一个目录,文件名为 logical ,之后离开; 4.) 如果存在的话,而且该名称为目录,则移除此目录!

第四题

习题答案

第一题

在这里插入图片描述

.sh后缀可以不加,但第一行必须有#!/bin/bash

第二题

在这里插入图片描述

第三题

在这里插入图片描述

总结

个人感觉,光是把这些内容看完、敲完,对 Shell 的掌握还远远不够。因此,我打算新开一个专栏,每天练习一道 Shell 编程题,不断积累实战经验。也愿与各位朋友共勉,在 Shell 的世界里越走越远!


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

相关文章

Win11安装Dify

1、打开Virtual Machine Platform功能 电脑系统为:Windows 11 家庭中文版24H2版本。 打开控制面板,点击“程序”,点击“启用或关闭Windows功能”。 下图标记的“Virtual Machine Platform”、“适用于 Linux 的 Windows 子系统”、“Windows…

自动化立体仓库堆垛机SRM控制系统FC19手动控制功能块开发

1、控制系统手动控制模块HMI屏幕设计如下图 屏幕分为几个区域:状态显示区、控制输入区、导航指示区、报警信息区。状态显示区需要实时反馈堆垛机的位置、速度、载货状态等关键参数。控制输入区要有方向控制按钮,比如前后左右移动,升降控制,可能还需要速度调节的滑块或选择按…

软件无线电技术之基带QPSK 调制技术+扩频技术

基带QPSK 调制技术 数字正交调制以0、1 比特流为调制信号,其过程就是将原始数据按照一定的规则映射至IQ 坐标系,而后经过DAC 转为模拟信号后才能进行后续的IQ 调制。 数字IQ 调制完成了符号到矢量坐标系的映射,映射点一般称为星…

图像数据与显存

一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分,也是默认你有之前复试班计算机视觉相关的知识,但是一些基础的概念我仍然会提。 昨天我们介绍了minist这个经典的手写数据集,作为图像数据,相较于结…

opencut:如何用AI工具把中文图片/视频翻译成英语、日语、俄语等100多种语言!

在全球化背景下,无论是学习、工作还是生活,多语言翻译需求日益增长。从跨境电商产品图的本地化适配,到学习资料的快速翻译,传统人工翻译不仅成本高、耗时长,还可能因文化差异导致误解。 今天为大家分享一款高效实用的 …

揭开帕金森的神秘面纱

帕金森是一种常见的神经退行性疾病,多在中老年群体中出现,平均发病年龄约 60 岁。它主要是由于脑内特定区域产生多巴胺的神经细胞退化,导致多巴胺分泌减少,从而影响了人体的运动和其他生理功能。 这种疾病最典型的表现是运动症状&…

SAP ByDesign,项目管理为核心的中小企业数字化转型之二

1.商机管理 – 把整个销售过程控制在公司手里 2.高效的销售跟进 – 方便地创建销售报价,销售订单和项目来有效跟进商机 – 灵活地定义服务:服务可以是固定价格的,也可以是按时间和物料来计算的;可以按项目的方式或者以管理服务的 方式 – 结合物料和费用…

利用Python直接生成html注意事项

最近在结合大模型直接生成代码,总是出现一些看起来没问题但就是运行不通的情况如下。 明明代码正常,但是报错 后来查询发现,在Python使用f-strnig直接写入时,在一个字符串内的单个{}为占位符,需要转义,也…

【前端】Hexo一键生成目录插件推荐_放入Hexo博客

效果 使用 安装 npm install hexo-auto-toc插件会自动对<article>包含下的所有内容进行解析&#xff0c;自动生成目录。如果你的文章页面结构中内容没被<article>包裹&#xff0c;需要自行添加它&#xff08;即blog文件夹下的index.html&#xff09;查看效果 hex…

智警杯备赛--数据库管理与优化及数据库对象创建与管理

sql操作 插入数据 如果要操作数据表中的数据&#xff0c;首先应该确保表中存在数据。没有插入数据之前的表只是一张空表&#xff0c;需要使用insert语句向表中插入数据。插入数据有4种不同的方式&#xff1a;为所有字段插入数据、为指定字段插入数据、同时插入多条数据以及插…

【LangChain】LangChain2-基础概念P1-输入控制与输出解析

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 引言基础代码LangChain python官方文档 输出可控…

在windows环境下安装Nmap并使用

Date: 2025-05-29 19:46:20 author: lijianzhan Nmap&#xff08;简称&#xff1a;Network Mapper&#xff09;是一款开源的网络扫描和嗅探工具包&#xff0c;Nmap主要作用是可以检测目标主机是否在线、主机端口开放情况、检测主机运行的服务类型及版本信息、检测操作系统与设备…

为什么我开始用 Data.olllo 做数据处理了?

之前我写过一篇文章&#xff0c;讲的是为什么我要做一个能打开 100GB CSV 的工具&#xff0c;叫 Data.olllo。 结果没想到&#xff0c;这篇文章不少人留言、私信我&#xff0c;问了一个类似的问题&#xff1a; “打开是解决了&#xff0c;那你用这个工具到底能干嘛&#xff1f…

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?

本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误&#xff0c;无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…

Spring未能自动解决循环依赖的问题

有过经验的同学应该都知道Spring能够自动解决循环依赖的问题&#xff0c;依靠的是它为单例池提供的三级缓存。如果你还不清楚三级缓存具体是怎么个解法的话&#xff0c;可以看一下这篇文章【图文详解】Spring是如何解决循环依赖的&#xff1f; 本文中的问题来源于我在开发项目…

RV1126 FFMPEG推流器理解

一.FFMPEG概念 概念&#xff1a;FFMPEG是一种音视频推流工具&#xff0c;把RV1126编码的视频&#xff0c;通过FFMPEG推流到流媒体服务器上&#xff0c;让大家都能访问和观看。为什么RV1126 编码的视频码流要利用 FFMPEG 框架推送到流媒体服务器&#xff0c;之前通过终端ffplay…

TeleAI发布TeleChat2.5及T1正式版,双双开源上线魔乐社区!

5月12日&#xff0c;中国电信开源TeleChat系列四个模型&#xff0c;涵盖复杂推理和通用问答的多个尺寸模型&#xff0c;包括TeleChat-T1-35B、TeleChat-T1-115B、TeleChat2.5-35B和TeleChat2.5-115B&#xff0c;实测模型性能均有显著的性能效果。TeleChat系列模型基于昇思MindS…

TMS320F28388D使用sysconfig配置IPC

第1章 配置IPC底层代码 使用IPC的动机&#xff1a; 我计划我的项目中要使用RS485&#xff0c;CANFD通信和EtherCAT通信&#xff0c;由于通信种类较多&#xff0c;而对于电机控制来说大部分数据都是重复的&#xff0c;并且有些数据可以很久才改变一次&#xff0c;所以我计划使…

Linux的线程同步

一、互斥锁&#xff08;互斥量&#xff09; 互斥锁是一种特殊的变量&#xff0c;有上锁&#xff08;lock&#xff09;和解锁&#xff08;unlock&#xff09;两种状态。 当处于解锁状态时&#xff0c;线程想获取该互斥锁&#xff0c;就可以获取不被阻塞&#xff0c;互斥锁变为…

.NET WinForm图像识别二维码/条形码

需求:图像识别出一张图片中的二维码或者条形码&#xff0c;并读取其中的内容。 一、安装ZXing.NET(此处建议使用0.14.0&#xff0c;高版本的不少地方进行优化&#xff0c;如果能处理好也可) Install-Package ZXing.Net 二、WinForm示例代码&#xff08;含关键优化&#xff0…