Bash 脚本逐行详解:一个HTTP请求与文件下载的示例

发布时间:2026/7/8 10:28:16

Bash 脚本逐行详解:一个HTTP请求与文件下载的示例
Bash 脚本逐行详解一个HTTP请求与文件下载的示例 目录脚本整体结构概览逐行逐函数详解核心知识点汇总二次开发指南常见问题与调试技巧一、脚本整体结构概览这个脚本是一个交互式数据获取器用于演示如何通过命令行工具获取和下载网络资源。整体流程如下┌─────────────────────────────────────────────────────────┐ │ 1. 创建下载目录 │ │ 2. 进入无限循环while true │ │ ├─ 输入关键词输入 q 退出 │ │ ├─ 输入子关键词 │ │ ├─ 搜索资源 → 获取资源ID │ │ ├─ 用ID获取真实下载链接 │ │ ├─ 提取文件扩展名 │ │ ├─ 下载文件 │ │ ├─ 检查HTTP状态码 │ │ └─ 移动到指定目录 │ │ 3. 退出循环显示结束信息 │ └─────────────────────────────────────────────────────────┘二、逐行逐函数详解 第 1 行#!/bin/bash#!/bin/bash这行代码称为shebang告诉操作系统脚本应该由哪个解释器来执行。此处指定使用bash。 第 3 行创建下载目录mkdir-p/storage/emulated/0/下载的资源mkdir: 创建目录的命令。-p: 如果父目录不存在则一并创建且如果目录已存在不报错。 第 12 行变量拼接name${artist}-${song}代码段说明name定义变量name${artist}-${song}字符串拼接。将artist和song用-连接起来${...}变量引用的标准写法比直接$artist更安全示例artist示例歌手song示例歌曲name示例歌手-示例歌曲 第 13-25 行函数get_resource_search_results()get_resource_search_results(){curl-s-XGEThttps://api.example.com/resource/search?keyword${artist}-${song}page1\-HUser-Agent: Mozilla/5.0 (Linux; Android 14; Redmi K30 Pro Build/UKQ1.230804.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36\-HAccept: */*\--compressed} 函数定义语法函数名(){# 函数体}curl命令详解curl是一个强大的命令行网络请求工具相当于命令行版的浏览器。参数全称说明-ssilent静默模式不显示进度条和错误信息-X GET指定请求方法为 GETGET 是获取数据的标准方法-HHeader添加 HTTP 请求头模拟浏览器行为--compressed接受压缩响应告诉服务器可以发送 gzip 压缩的内容 URL 解析https://api.example.com/resource/search?keyword示例歌手-示例歌曲page1部分说明https://协议加密的超文本传输协议api.example.com服务器域名教学示例/resource/search接口路径?keyword示例歌手-示例歌曲查询参数搜索关键词page1查询参数页码page number 1 HTTP 请求头解析请求头是浏览器/客户端发给服务器的“自我介绍”。头信息说明User-Agent最重要的头伪装成 Android 手机浏览器让服务器以为是正常用户Accept: */*接受任何类型的响应内容 第 27-30 行函数extract_rid()extract_rid(){echo${1}|awk-F/\id\/{print $4; exit}} 函数参数${1}是函数的第一个参数。awk命令解析假设搜索返回的 JSON 类似这样{status:1,data:[{id:12345,name:示例}]}-F: 将作为字段分隔符。/\id\/{...}: 匹配包含id的行。print $4: 打印第4个字段即id的值。 第 31-37 行函数get_resource_url()get_resource_url(){curl-s-XGEThttps://api.example.com/resource/download?id${1}\-HUser-Agent: Mozilla/5.0 (Linux; Android 14; Redmi K30 Pro Build/UKQ1.230804.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36\--compressed}这个函数和get_resource_search_results()几乎一样区别是比较项搜索函数下载URL获取函数URLsearch?keyword...download?id...参数关键词资源ID返回搜索结果列表真实下载链接流程关系搜索(关键词) → 获取资源ID → 用ID获取真实下载链接 第 39-44 行函数get_file_extension()get_file_extension(){case${1}in*.*)echo${1##*.};;*)echo;;esac}case语句case变量in模式1)命令;;模式2)命令;;*)默认命令;;esac${1##*.}—— 参数扩展这是 bash 的高级字符串操作语法说明${var##*.}从变量开头删除最长匹配的*.部分保留剩余内容示例urlhttps://example.com/resource/file.pdf${url##*.}# 结果是pdf函数逻辑如果 URL 包含.→ 提取扩展名pdf/txt/json 等如果 URL 不包含.→ 返回空字符串 第 46-50 行函数download_resource()download_resource(){echo开始下载${name}.${2}...curl-# ${1} ${name}.${2}echo下载完成${name}.${2}.}代码段说明${name}使用外层定义的name变量关键词-子关键词${1}第一个参数下载链接${2}第二个参数文件扩展名curl -#-#显示简单的进度条# 号重定向符号把 curl 的输出保存到文件 第 52-55 行主执行流程调用函数search_result$(get_resource_search_results)RID$(extract_rid${search_result})resource_url$(get_resource_url${RID})file_extension$(get_file_extension${resource_url})$(命令)—— 命令替换$(命令)会执行括号内的命令把输出结果作为字符串返回。逐行解析代码说明search_result$(get_resource_search_results)调用搜索函数把返回的 JSON 保存到search_resultRID$(extract_rid ${search_result})把搜索结果传给extract_rid提取资源IDresource_url$(get_resource_url ${RID})用资源ID获取真实下载链接file_extension$(get_file_extension ${resource_url})从链接中提取文件扩展名数据流关键词 → 搜索结果(JSON) → 资源ID → 下载URL → 扩展名 第 58-64 行下载并检查状态# 开始下载download_resource${resource_url}${file_extension}# 检查下载进度直到进度条达到100%progress$(curl-s-o/dev/null-w%{http_code}${resource_url})while[$progress!200];dosleep1progress$(curl-s-o/dev/null-w%{http_code}${resource_url})donecurl -s -o /dev/null -w %{http_code}参数说明-s静默模式-o /dev/null把响应体丢弃/dev/null是“黑洞”-w %{http_code}write out只输出 HTTP 状态码 这个循环的问题说明教学重点这段代码存在以下逻辑问题是为了教学演示而保留的顺序错误先执行了download_resource下载文件然后才检查状态码。如果下载时出错文件可能已经损坏。无限循环风险如果服务器一直返回非200状态码这个循环会永远执行下去。正确的做法应当是先检查状态码确认可以下载后再开始下载或者给循环加上最大重试次数。 第 66 行移动文件mv-f./{*.pdf,*.txt,*.json}/storage/emulated/0/下载的资源代码段说明mvmove移动文件-fforce强制覆盖不提示./当前目录{*.pdf,*.txt,*.json}花括号扩展匹配当前目录下所有 pdf/txt/json 文件目标路径/storage/emulated/0/下载的资源四、二次开发指南️ 改进方向 1添加重试次数限制# 改进后的下载检查最多重试 5 次max_retries5retry_count0progress$(curl-s-o/dev/null-w%{http_code}${resource_url})while[$progress!200][$retry_count-lt$max_retries];dosleep2progress$(curl-s-o/dev/null-w%{http_code}${resource_url})retry_count$((retry_count1))echo第${retry_count}次重试...doneif[$progress200];thendownload_resource${resource_url}${file_extension}elseecho下载失败已重试${max_retries}次continuefi️ 改进方向 2支持批量下载从文件读取列表创建列表文件resources.txt示例歌手-示例歌曲 另一作者-另一作品 第三作者-第三作品改进脚本#!/bin/bashmkdir-p/storage/emulated/0/下载的资源# 从文件读取每行格式关键词-子关键词whileIFSread-rline||[-n$line];do# 跳过空行和注释行[-z$line]continue[[$line~^# ]] continue# 用 - 分割主关键词和子关键词artist${line%%-*}song${line#*-}name${line}echo正在处理:${name}# ... 原来的搜索、下载逻辑 ...doneresources.txt️ 改进方向 3添加下载进度显示download_resource(){echo开始下载${name}.${2}...curl--progress-bar-o${name}.${2}${1}echoecho下载完成${name}.${2}.}️ 改进方向 4添加日志记录LOG_FILEdownload.loglog(){echo[$(date%Y-%m-%d %H:%M:%S)]$1|tee-a$LOG_FILE}# 使用方式log开始下载:${name}log下载失败: HTTP${progress}代码段说明date %Y-%m-%d %H:%M:%S获取当前时间tee -a同时输出到屏幕和追加到文件️ 改进方向 5支持自定义下载目录read-p请输入下载目录默认 /storage/emulated/0/下载的资源download_dirdownload_dir${download_dir:-/storage/emulated/0/下载的资源}mkdir-p$download_dir# 修改移动命令mv-f./{*.pdf,*.txt,*.json}$download_dir️ 改进方向 6使用更健壮的 JSON 解析原代码的awk方法不够健壮推荐安装jq工具# 安装 jq需要管理员权限# apt install jq# 改进后的 extract_ridextract_rid(){echo${1}|jq-r.data[0].id // empty}️ 改进方向 7添加文件存在性检查download_resource(){localfilename${name}.${2}if[-f$filename];thenread-p文件${filename}已存在是否覆盖(y/n): confirmif[$confirm!y];thenecho跳过下载return1fifiecho开始下载${filename}...curl-# ${1} $filenameecho下载完成${filename}.}代码段说明[ -f 文件 ]检查文件是否存在local定义局部变量只在函数内有效return 1返回错误码非 0 表示出错 完整改进版脚本示例#!/bin/bash# 配置区 DOWNLOAD_DIR/storage/emulated/0/下载的资源MAX_RETRIES3LOG_FILEdownload.log# # 创建下载目录mkdir-p$DOWNLOAD_DIR# 日志函数log(){echo[$(date%Y-%m-%d %H:%M:%S)]$1|tee-a$LOG_FILE}log 资源下载器启动 whiletrue;doread-p请输入主关键词退出输入 q artist[$artistq]breakread-p请输入子关键词空格输入 _ songname${artist}-${song}log开始搜索:${name}# 搜索资源search_result$(curl-s-XGEThttps://api.example.com/resource/search?keyword${artist}-${song}page1\-HUser-Agent: Mozilla/5.0 (Linux; Android 14; Redmi K30 Pro) AppleWebKit/537.36 Chrome/117.0.0.0 Mobile Safari/537.36\-HAccept: */*\--compressed)# 提取资源IDRID$(echo${search_result}|awk-F/\id\/{print $4; exit})if[-z$RID];thenlog错误: 未找到资源${name}continuefilog获取到资源ID:${RID}# 获取下载链接resource_url$(curl-s-XGEThttps://api.example.com/resource/download?id${RID}\-HUser-Agent: Mozilla/5.0 (Linux; Android 14; Redmi K30 Pro) AppleWebKit/537.36 Chrome/117.0.0.0 Mobile Safari/537.36\--compressed)if[-z$resource_url];thenlog错误: 无法获取下载链接continuefilog下载链接:${resource_url}# 提取扩展名if[[$resource_url*.*]];thenfile_extension${resource_url##*.}elsefile_extensiontxtfifilename${name}.${file_extension}# 检查文件是否已存在if[-f$filename];thenread-p文件${filename}已存在是否覆盖(y/n): confirm[$confirm!y]continuefi# 下载文件带重试log开始下载:${filename}retry_count0download_successfalsewhile[$retry_count-lt$MAX_RETRIES];doifcurl-fSL-o$filename$resource_url;thendownload_successtruebreakfiretry_count$((retry_count1))log下载失败第${retry_count}次重试...sleep2doneif[$download_successtrue];thenmv-f$filename$DOWNLOAD_DIRlog下载成功:${filename}elselog下载失败:${filename}已重试${MAX_RETRIES}次rm-f$filenamefidonelog 资源下载器结束 echo感谢使用​

相关新闻

K4F6E3S4HM-TFCL03V选型指南:LPDDR4产品线对比与移动内存选型建议

K4F6E3S4HM-TFCL03V选型指南:LPDDR4产品线对比与移动内存选型建议

2026/7/8 10:28:16

K4F6E3S4HM-TFCL03V:三星16Gb LPDDR4移动内存颗粒深度解析 在旗舰智能手机、高性能平板以及各类对功耗和性能有综合要求的移动嵌入式应用中,LPDDR4内存颗粒的选型直接影响系统的多任务处理能力和能效表现。三星推出的K4F6E3S4HM-TFCL03V作为一款16Gb&am…

STM32F407ZG与LTC1864高精度ADC数据采集系统设计

STM32F407ZG与LTC1864高精度ADC数据采集系统设计

2026/7/8 10:28:16

1. LTC1864与STM32F407ZG的硬件架构解析在工业测量和自动化控制领域,模拟信号采集系统需要同时满足高精度和实时性的要求。LTC1864作为一款16位逐次逼近型(SAR)ADC,与STM32F407ZG这款基于ARM Cortex-M4内核的微控制器组合,能够构建高性能的混…

5分钟终极解锁:Wand-Enhancer完整游戏增强方案指南

5分钟终极解锁:Wand-Enhancer完整游戏增强方案指南

2026/7/8 10:18:15

5分钟终极解锁:Wand-Enhancer完整游戏增强方案指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为游戏修改器的付费功能而犹豫不决吗…

L9958与PIC18F97J94组合在电机控制中的优势与实践

L9958与PIC18F97J94组合在电机控制中的优势与实践

2026/7/8 11:48:22

1. 为什么选择L9958与PIC18F97J94组合在电机控制领域,芯片选型直接决定了系统性能上限。L9958作为意法半导体(ST)推出的多通道电机驱动芯片,其核心优势在于集成了4个独立的H桥驱动器,每个通道可提供高达1.5A的持续输出电流。这种设计允许单个…

IIM-20670运动传感器与PIC18F67K40的SPI通信与数据处理

IIM-20670运动传感器与PIC18F67K40的SPI通信与数据处理

2026/7/8 11:48:22

1. IIM-20670运动传感器深度解析 IIM-20670是TDK InvenSense推出的一款工业级6轴运动跟踪传感器,集成了3轴陀螺仪和3轴加速度计。这款传感器在运动跟踪领域具有显著优势,其陀螺仪量程范围从41dps到1966dps可调,加速度计量程可达16g。这种宽量…

高精度运动跟踪系统:IIM-20670与PIC18F46K80的硬件设计与算法实现

高精度运动跟踪系统:IIM-20670与PIC18F46K80的硬件设计与算法实现

2026/7/8 11:48:22

1. 项目背景与核心器件选型 在工业自动化、无人机飞控和医疗设备等领域,高精度运动跟踪一直是核心技术痛点。传统方案要么成本过高,要么精度不足,难以平衡性能与价格。这次我们选用了TDK InvenSense的IIM-20670六轴运动传感器与Microchip的PI…

通信拓扑决定多机器人协同上限:比模型规模更关键的设计核心

通信拓扑决定多机器人协同上限:比模型规模更关键的设计核心

2026/7/8 11:48:22

1. 这句话到底在说什么?——先别急着抄公式,搞懂它解决的是什么真问题“多机器人系统中通信拓扑比模型规模更能提升协同性能”——这句话乍看像论文摘要里甩出来的结论句,干巴巴、没温度,还带着点学术腔的压迫感。但作为在工业AGV…

IIM-20670运动传感器与MKV46F256VLH16微控制器应用指南

IIM-20670运动传感器与MKV46F256VLH16微控制器应用指南

2026/7/8 11:48:22

1. IIM-20670运动传感器深度解析 IIM-20670是TDK InvenSense推出的一款6轴工业级运动追踪MEMS器件,集成了3轴陀螺仪和3轴加速度计。这款传感器在运动跟踪领域具有显著优势,其陀螺仪测量范围可从41dps扩展到1966dps,加速度计量程可达2g至16g&a…

小红书内容采集与下载完整指南:三步实现高效无水印保存

小红书内容采集与下载完整指南:三步实现高效无水印保存

2026/7/8 11:38:21

小红书内容采集与下载完整指南:三步实现高效无水印保存 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&am…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/8 0:44:47

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/8 6:29:42

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/7 13:20:59

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

2026/7/8 0:07:15

1. 项目概述:这不是又一个笔记软件教程,而是一套可复用的“认知操作系统”搭建逻辑你有没有试过,在读完Andrej Karpathy那篇著名的《Software 2.0》之后,满脑子都是“神经网络即代码”的震撼,但合上网页,打…

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

2026/7/8 0:07:15

校园服饰细分赛道测算程序(Python)——学生平价国风 & 机能穿搭市场规模预估(TAM / SAM / SOM)一、实际应用场景描述(真实业务抽象)在《时尚产业与品牌创新》课程中,细分市场切入&#xff0…

Visual C++运行库完整解决方案:告别软件兼容性问题

Visual C++运行库完整解决方案:告别软件兼容性问题

2026/7/8 0:07:15

Visual C运行库完整解决方案:告别软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾为打开游戏时弹出的"DLL缺失"错误…