目录

一、Shell 是什么

二、 .sh 脚本调用 .py 脚本

Python 核心逻辑脚本(data_processor.py)

Shell 脚本(pipeline.sh)

三、常见命令

四、.sh脚本

1. 简单例子

2. 进阶例子

3. 猜数字游戏


一、Shell 是什么

Shell 的本质是 “命令行解释器(Command-Line Interpreter)”,其核心功能是:

  1. 接收用户输入:用户在终端(Terminal)中输入命令(如 ls 查看文件、python train.sh 启动训练脚本);
  2. 解析命令含义:Shell 把用户输入的 “人类可读命令” 翻译成内核能理解的 “机器指令”;
  3. 调用内核执行:Shell 将解析后的指令传递给内核,让内核调度硬件完成任务(如读取磁盘文件、分配 GPU 资源);
  4. 返回执行结果:内核执行完任务后,将结果通过 Shell 反馈给用户(如在终端显示文件列表、训练日志)。

简言之,如果把 操作系统内核(如 Linux 内核、Windows 内核) 看作 “电脑的发动机”(负责硬件调度、资源分配等核心工作),那么 Shell 就是 “发动机的操作面板”—— 它是用户与操作系统内核之间的 “桥梁”,让用户能通过输入命令,间接控制内核完成各种任务(如创建文件、启动程序、管理进程等)。

二、 .sh 脚本调用 .py 脚本

一般用 .sh 脚本调用 .py 脚本,让 Shell 负责搭建执行框架、和系统交互(如文件操作、环境配置、命令调用),Python 负责核心逻辑处理。

为什么不全用.py?

因为 Shell 更擅长 “对接操作系统”,Python 虽然能通过 os 模块调用系统命令,但本质是 “间接调用”。所以.sh搭配.py效率更高、分工更明确。

假设我们需要实现一个 “数据处理流水线”,功能包括:

  1. 检查输入数据目录是否存在(Shell 负责);
  2. 创建输出结果目录(Shell 负责);
  3. 调用 Python 脚本处理数据(清洗、计算)(Python 负责);
  4. 压缩处理后的结果(Shell 负责);
  5. 发送邮件通知任务完成(Shell 调用系统工具负责)。
Python 核心逻辑脚本(data_processor.py

通过命令行参数接收输入 / 输出路径,负责具体的数据处理(如过滤异常值、计算平均值)。

# data_processor.py
import sys
import pandas as pddef main():# 从命令行参数获取输入文件路径和输出文件路径if len(sys.argv) != 3:print("用法:python3 data_processor.py <输入文件> <输出文件>")sys.exit(1)  # 异常退出,方便 Shell 捕获错误input_path = sys.argv[1]output_path = sys.argv[2]try:# 核心逻辑:读取数据、处理、保存结果df = pd.read_csv(input_path)  # 用 pandas 处理 CSV 数据df_clean = df[df["value"] > 0]  # 过滤异常值(假设 value 列不能为负)df_clean["mean"] = df_clean["value"].mean()  # 计算平均值df_clean.to_csv(output_path, index=False)print(f"处理完成!结果已保存到 {output_path}")sys.exit(0)  # 正常退出except Exception as e:print(f"处理失败:{str(e)}", file=sys.stderr)  # 错误信息输出到 stderrsys.exit(1)  # 异常退出if __name__ == "__main__":main()
Shell 脚本(pipeline.sh

负责流程控制、系统交互,调用 Python 脚本并处理前后的辅助任务。

#!/bin/bash
# pipeline.sh:数据处理流水线的控制脚本# 1. 定义参数(输入/输出路径)
INPUT_DIR="./raw_data"
OUTPUT_DIR="./processed_data"
INPUT_FILE="${INPUT_DIR}/data.csv"
OUTPUT_FILE="${OUTPUT_DIR}/result.csv"
ZIP_FILE="${OUTPUT_DIR}/result.zip"
EMAIL="user@example.com"  # 接收通知的邮箱# 2. 检查输入文件是否存在(Shell 系统交互能力)
if [ ! -f "${INPUT_FILE}" ]; thenecho "错误:输入文件 ${INPUT_FILE} 不存在!" >&2  # 错误信息输出到 stderrexit 1  # 退出脚本,终止流程
fi# 3. 创建输出目录(若不存在)
mkdir -p "${OUTPUT_DIR}"  # -p 确保父目录不存在时也能创建
echo "输出目录已准备:${OUTPUT_DIR}"# 4. 调用 Python 脚本处理数据(核心逻辑交给 Python)
echo "开始处理数据..."
python3 data_processor.py "${INPUT_FILE}" "${OUTPUT_FILE}"# 检查 Python 脚本是否执行成功(通过退出码判断)
if [ $? -ne 0 ]; then  # $? 是上一条命令的退出码(0 为成功,非 0 为失败)echo "数据处理失败,终止流程" >&2exit 1
fi# 5. 压缩处理结果(Shell 调用系统压缩命令)
zip -q "${ZIP_FILE}" "${OUTPUT_FILE}"  # -q 静默模式,不输出冗余信息
echo "结果已压缩:${ZIP_FILE}"# 6. 发送邮件通知(Shell 调用系统邮件工具)
echo "数据处理流水线已完成,结果见附件" | mail -s "任务完成通知" -a "${ZIP_FILE}" "${EMAIL}"
echo "通知邮件已发送到 ${EMAIL}"# 7. 流程结束
echo "所有任务完成!"
exit 0

关键协作方式:

(1)参数传递

Shell 脚本通过 命令行参数 将必要信息(如文件路径、配置项)传递给 Python 脚本,Python 用 sys.argv 接收。

比如:.sh里面的一行

python3 data_processor.py input.csv output.csv

Python 中 sys.argv[1] 接收 input.csvsys.argv[2] 接收 output.csv

  • sys.argv[0] → data_processor.py(python脚本自身的文件名)

(2)环境变量共享

Shell 中定义的环境变量(如 export DATA_PATH="./data"),可在 Python 中通过 os.environ 读取:

import os
data_path = os.environ.get("DATA_PATH")

(3)状态反馈

Python 脚本通过 退出码sys.exit(0) 表示成功,sys.exit(1) 表示失败)告诉 Shell 执行结果。Shell 用 $? 变量获取退出码,判断是否继续后续流程(如示例中 “若 Python 失败则终止脚本”)。

三、常见命令

1. echo 打印字符串或者变量值

注意:定义变量时,name="Amy"中间不能有空格

打印变量时,前面加上$标记:$name

和字符串混合打印时,变量名用{}包裹(解决边界问题):${name}

echo $HOME

打印当前用户的主目录(家目录)路径

echo $PATH

打印$PATH,存储着系统查找可执行程序的目录列表

echo $SHELL

存储着当前用户默认使用的 Shell 程序路径 。

echo $0

当前执行的脚本名称

($1 $2 $3 传递给这个脚本的第一二三个参数)

2. cat 连接文件并打印其内容

查看单个文件内容:cat test.txt

查看多个文件内容:cat file1.txt file2.txt

创建新文件:cat > new_file.txt

输入cat > new_file.txt后回车,然后在终端中输入想要写入文件的内容,每输入一行后按回车键换行,输入完成后,按下Ctrl + D组合键,即可将输入的内容保存到new_file.txt文件中。

复制文件内容到另一个文件:cat file1.txt file2.txt > combined.txt

这会把file1.txtfile2.txt的内容合并到combined.txt文件中。如果combined.txt不存在,会创建该文件,如果已存在,则会覆盖原有内容。

追加内容到文件:cat >> file.txt

手动方式:

cat >> test.txt
这是追加的第一行内容
这是追加的第二行内容
(按 Ctrl + D 结束输入)

自动方式(通过管道):

# 把 echo 输出的内容追加到 file.txt
echo "这是通过 echo 追加的内容" | cat >> file.txt# 把 ls 命令的结果(当前目录文件列表)追加到 file.txt
ls | cat >> file.txt# 把另一个文件的内容追加到 file.txt
cat other_file.txt | cat >> file.txt

3. ls

ls -a 显示所有文件(包括以.开头的隐藏文件)

存储环境变量:.profile(用户登录时执行,只执行一次) 和 .bashrc (每次打开一个终端新建一个shell会话时执行)

一般推荐把环境变量放在.bashrc里

四、.sh脚本

1. 简单例子

#!/bin/bash:告诉操作系统“这个脚本需要用哪个解释器来执行”,这里指定要用 位于/bin 目录下的 Bash 解释器

注意:要在 linux 环境执行,这里可以用 Git Bash 

chmod a+x tets.sh:chmod 是 “change mode” 的缩写,专门用于修改文件 / 目录的访问权限


./test.sh:执行当前目录下 test.sh 脚本

2. 进阶例子

#!/bin/bash# 判断一个数是否为素数
is_prime(){local num=$1# 素数判断条件1:小于2的数(1、0、负数)一定不是素数if [ $num -lt 2 ]; thenreturn 1fi# 素数判断条件2:遍历从2到 sqrt(num) 的所有整数,检查是否能整除 numfor ((i=2;i*i<=num;i++)); do# 若余数为0,说明 num 有除1和自身外的因数,不是素数if [ $((num%i)) -eq 0 ]; thenreturn 1fidonereturn 0
}read -p "请输入一个正整数:" numberif is_prime $number; thenecho "$number 是素数"
elseecho "$number 不是素数"
fi

在函数中定义局部变量:加上local,比如 local num=1

$1:函数的第一个参数

$变量名:取变量的值(如 $number);

$(命令):取命令的输出结果(如

current_dir=$(pwd)  # 执行 pwd 命令(显示当前目录),将结果存入 current_dir

);

$((表达式)):执行算术运算并返回结果(如 $((num%i)) 求余数,注意$((...)) 内部已经能自动解析变量,不需要再给变量加 $)。

-lt:小于,less than

-gt:大于,greater than

-eq:等于,equal to   -ne:不等于,not equal to

-le:小于等于,less than or equal to

-ge:大于等于

(以 - 开头的字符串通常表示 “选项” 或 “操作符”)

 注意:0真(成功)或 1假(失败),是人为规定的历史惯例

对于一个命令 / 函数,“成功执行” 的结果只有一种(比如 ls 成功列出文件),用 0 表示足够;
但 “失败” 的原因有很多(比如文件不存在、权限不足、参数错误),可以用不同的非 0 值区分(例如 1 表示通用错误,2 表示权限错误,127 表示命令不存在)。

if [ 条件判断 ]; then# 条件为真时执行的代码
else# 条件为假时执行的代码
fi  # 这里的 fi 表示整个 if 语句结束

注意:if [空格 ... 空格]; then

else

fi(fi 是 if 条件判断语句的闭合标记,用于表示一个 if 块的结束,相当于 if 的 “右括号”)

  • 当调用 is_prime $number 时,函数本身已经输出了 “真假” 对应的返回值;
  • if 可以直接接收这个返回值,无需再用 [] 二次判断。

for 变量名 in 列表; do# 循环体:对列表中的每个元素执行的命令
done# 例如
# 遍历列表中的水果名称
for fruit in 苹果 香蕉 橙子 葡萄; doecho "我喜欢吃 $fruit"
done

或者:

for (( 初始值; 循环条件; 步长 )); do# 循环体:对每个数值执行的命令
done# 例如
# 输出 1 到 5 的数字
for ((i=1; i<=5; i++)); doecho "当前数字:$i"
done

for ((...)); do

done

函数名() {# 函数体(一系列命令)
}函数名 参数1 参数2 ...

不需要 is_prime(参数) 的形式

read -p "请输入一个正整数:" number:read [选项] 变量名

read 读取用户输入,并将输入内容赋值给后面指定的变量 number

选项 -p "提示信息" 输入前显示提示信息

3. 猜数字游戏

#!/bin/bash# 把生成的随机数赋值给number
number=$(shuf -i 1-10 -n 1)
echo $numberwhile true; doread -p "请输入一个1-10之间的数字:" guessif [ $guess -eq $number ]; thenecho "恭喜你,猜对了!是否继续?(y/n):"read choiceif [ $choice == 'y' ] || [ $choice == 'Y' ]; thennumber=$(shuf -i 1-10 -n 1)echo $numbercontinueelsebreakfi
elif [ $guess -gt $number ]; thenecho "猜大了"
elseecho "猜小了"
fidone

shuf -i 1-10 -n 1:从 1 到 10 之间随机选出 1 个整数

# 把生成的随机数赋值给number
number=$(shuf -i 1-10 -n 1)
echo $number

[[]] 比 [] 更加兼容、更强大、不易出错(但是现在好像[]很多都可以):

特性[](test 命令)[[ ]](Bash 扩展测试)
本质是 /bin/test 命令的简写(外部命令)Bash 内置的扩展语法(更强大的内部实现)
字符串比较需用 =,且变量必须加引号(如 [ "$a" = "$b" ]支持 = 或 ==,变量可省略引号(如 [[ $a == $b ]]
正则匹配不支持支持 =~ 进行正则匹配(如 [[ $str =~ ^[0-9]+$ ]]
逻辑运算符用 -a(与)、-o(或),且优先级低用 &&、||
数值比较支持 -eq-gt 等(与 [[ ]] 相同)支持 -eq-gt 等,也支持 <>(需注意空格)
变量空值处理变量为空时易报错(需加引号避免)

变量为空时自动处理,更安全

while [[ $guess -ne $number ]],虽然在while之前guess还没获取,但是[[]]会自动给guess赋值为0

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNet改进(36):融合FSATFusion的医学图像分割

1. 注意力机制的理论基础 1.1 空间注意力机制 空间注意力机制模拟人类视觉系统,能够关注图像中的显著区域。其核心思想是根据特征图的空间位置生成权重图,突出重要区域并抑制无关信息。常见的实现方式是通过沿通道维度的池化操作获取空间统计信息,然后通过卷积层生成空间注…

docker安装kafka、zookeeper详细步骤

Kafka 简介 Kafka 是一个分布式流处理平台,由 LinkedIn 开发并开源,主要用于高吞吐量的实时数据管道和流处理。 核心特性 高吞吐量:支持每秒百万级消息处理,适合大数据场景。 持久化存储:消息可持久化到磁盘,并支持多副本备份。 分布式架构:支持水平扩展,通过分区(P…

Photoshop - Ps 编辑图像

使用基本图像编辑技术&#xff0c;让图像展现出最好的一面。1.修剪和拉直使用裁剪工具&#xff0c;可以修剪边缘&#xff0c;更改图像的形状和大小&#xff0c;甚至可以对图像进行拉直和弯曲的操作。2.改善亮度和色彩点击菜单栏-编辑-调整-亮度/对比度&#xff0c;调整图像的亮…

SpringBoot 配置文件在运维开发中的应用

在 SpringBoot 项目的运维开发工作里&#xff0c;配置文件相关知识是绕不开的重要内容。它关乎着项目在不同环境下的灵活部署、参数调整&#xff0c;直接影响着应用的稳定性与可维护性。接下来&#xff0c;我们就从临时属性、属性加载优先顺序、配置文件分类这几个维度&#xf…

雷卯国产化之SE3401完全替代AOS的AO3401

上海雷卯PMOS型号SE3401 pin to pin替代AOS型号AO3401&#xff0c;已经有很多客户选用 SE3401替代AO3401&#xff0c;客户可以获得更好的价格和更快的交期。特别是在一些受空间收下限的小电子设备很受青睐。参数对比如下&#xff1a;以下是SE3401&#xff08;P沟道MOSFET&#…

多语言与零样本语音识别新突破:基于发音特征分类的方法

多语言与零样本语音识别新突破:基于发音特征分类的方法 在语音识别领域,多语言和零样本(zero-shot)语言的识别一直是一个极具挑战性的课题。近期,京都大学的研究团队提出了一种全新的方法,通过引入国际音标(IPA)和发音特征(Articulatory Features)来提升语音识别系统…

1.8 Memory

1.Memory简介 2.Memory中各参数的功能和作用1.Memory简介 1).Memory(内存)模块它是unity中监视内存使用情况的关键工具, 它能帮助我们识别哪些资源在占有大量内存,是否存在内存泄露或垃圾回收频繁等问题2).游戏中如果出现以下问题, 可以重点观察memorya.游戏卡顿, 掉帧- 表现: …

国家统计局数据爬取——机器学习

这个代码是一个用于爬取国家统计局网站数据的Python脚本。下面我将详细解释代码的各个部分及其设计思路。 代码结构概述 import requests # 发送HTTP请求 from bs4 import BeautifulSoup # 解析HTML import pandas as pd # 数据处理和存储 import time # 时间控制 import…

内存管理(智能指针,内存对齐,野指针,悬空指针)

&#x1f4cc; 1. 野指针 (Wild Pointer)什么是野指针&#xff1f;野指针指的是未初始化的指针变量。它指向的内存地址是随机的、未知的。产生原因cppint* ptr; // 野指针&#xff01;未初始化&#xff0c;指向随机地址 *ptr 10; // 危险&#xff01;可能破坏系统内存char* st…

Spring代理的特点

一.Spring代理的特点1.依赖注入和初始化影响的是原始的对象。2.代理和目标是两个对象&#xff0c;二者成员变量不共用数据。二.测试首先准备以下几个类。Bean1package com.example.springdemo.demos.a13;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.…

嵌入式学习日记(35)TCP并发服务器构建

单循环服务器&#xff1a;服务端同一时刻只能处理一个客户端的任务并发服务器&#xff1a;服务端同一时刻可以处理多个客户端的任务TCP并发服务器构建&#xff1a;TCP&#xff1a; 1. 建立连接&#xff0c;一对一TCP服务端并发模型&#xff1a;1. 多进程进程资源开销大&#x…

【Flask】测试平台开发实战-第二篇

概述&#xff1a;在上一篇我们已经将后端初始化服务后前端的vue框架初始化已经搭建完整&#xff0c;并且可以运行看到界面&#xff0c;服务正常&#xff0c;当然我们看到的前端数据都是mock下的假数据&#xff0c;并不是真实的&#xff0c;这篇我们来开发实现第一个功能&#x…

聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集

一&#xff1a;背景 1. 讲故事 最近在分析一个崩溃dump时&#xff0c;发现祸首和AssemblyLoadContext有关&#xff0c;说实话这东西我也比较陌生&#xff0c;后来查了下大模型&#xff0c;它主要奔着替代 .NetFrameWork 时代的 AppDomain 的&#xff0c;都是用来做晚期加卸载&a…

Java中使用Spring Boot+Ollama实现本地AI的MCP接入

目录结构完善spring bootpom.xml添加依赖application.ymlMCP 工具配置 mcp-servers.json配置类编写API在我的上一篇文章搭建好本地的聊天机器人后&#xff0c;准备接入MCP进一步增强AI的能力&#xff0c;以实现类似手机AI的功能 参考的是第二篇文章链接其内容比较精炼&#x…

C#正则表达式与用法

&#x1f31f; C# 常用正则表达式与用法C# 使用正则需要引用命名空间&#xff1a;using System.Text.RegularExpressions; 常用方法&#xff1a;Regex.IsMatch(input, pattern) → 返回 bool&#xff0c;用于验证Regex.Match(input, pattern) → 返回 Match 对象&#xff0c;可…

从0开始学习Java+AI知识点总结-27.web实战(Maven高级)

一、分模块设计与开发&#xff1a;让项目结构更清晰1.1 为什么需要分模块&#xff1f;单模块开发的痛点在小型项目中&#xff0c;单模块&#xff08;所有代码放在一个工程&#xff09;或许能满足需求&#xff0c;但项目规模扩大后会出现两大核心问题&#xff1a;维护成本高&…

Ferris Wheel (贪心 | 双指针)

题目&#xff1a;思路&#xff1a;本题注意题目的条件即可&#xff0c;题意说一个摩天轮可以坐一个人或者两个人&#xff0c;那么显然我们就可以贪心一下具体的&#xff0c;我们可以让最小的去匹配最大的&#xff0c;如果此时大于 x&#xff0c;那么显然我们根本无法使得 最大的…

课程视频怎么加密?在线教育机构常用的6个课程加密方法

知识付费时代&#xff0c;课程视频是教育机构的核心资产。但是不难发现&#xff0c;课程视频的安全却得不到保障。各大购物平台搜索课程名称&#xff0c;便出现了许多盗版课程。如何有效防止课程被翻录和二次传播&#xff0c;成为急需解决的关键问题。今天这期分享点干货&#…

SOME/IP-SD中”服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项的区分

<摘要> AUTOSIP-SD协议中组播端点&#xff08;Multicast Endpoint&#xff09;在不同上下文中的角色与表述差异。准确理解“服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项”中配置的端点之间的关系&#xff0c;是正确实现组播事件分发机制的关键。这涉及…

计算机是如何运行的

目录 一&#xff0c;计算机是如何组成的 1.1&#xff0c;CPU中央处理单元 1.1.1&#xff0c;CPU的构成和属性 1.1.2&#xff0c;如何判断cpu的好坏 1.1.3&#xff0c;指令 1.1.4&#xff0c;CPU的缓存 1.2&#xff0c;操作系统 1.2.1&#xff0c;进程 1.2.2&#xff0…