Shell脚本入门到实战:自动化运维与文本处理核心技巧
1. 从“黑窗口”到自动化利器为什么你需要学习Shell脚本如果你每天的工作都离不开那个黑色的终端窗口或者你经常需要重复执行一系列枯燥的命令比如批量重命名文件、定时备份数据、或者检查一堆服务器的状态那么Shell脚本就是你必须掌握的技能。它不是什么高深莫测的黑魔法而是将你手动敲入的命令按照逻辑顺序写进一个文本文件里然后让计算机自动、反复地去执行。想象一下你每天上班第一件事是登录五台服务器查看日志、检查磁盘空间、重启某个服务。手动操作可能需要15分钟还容易出错。而一个几十行的脚本可能只需要几秒钟并且每次执行的结果都一模一样。这就是Shell脚本最直接的价值将重复劳动自动化将复杂操作流程化。很多人觉得Shell脚本是运维工程师的专属其实不然。对于开发者来说用它来编译项目、运行测试、打包部署对于数据分析师用它来清洗和整理原始数据文件甚至对于普通电脑用户用它来管理照片、整理文档都大有裨益。它的学习曲线相对平缓因为你不需要先学习一门完整的编程语言语法你只需要知道怎么把命令组合起来。你之前零星使用过的那些命令比如ls,cp,grep就是构建脚本的砖瓦。学习Shell脚本本质上是在学习如何更聪明、更高效地使用命令行是对你已有知识的一次系统化升级和威力放大。我最初学习Shell脚本就是因为被一次手工处理上千个数据文件的任务搞到崩溃。从那以后我几乎养成了一个习惯任何需要重复超过三次的操作我都会想一想“能不能写个脚本” 这不仅节省了时间更重要的是它把操作过程固化了下来变成了可分享、可复查、可改进的资产。接下来我会带你从最基础的概念开始一步步拆解Shell脚本的核心要素并分享那些只有踩过坑才知道的实操技巧。2. Shell脚本的核心骨架与执行原理2.1 第一行“魔法注释”#!/bin/bash创建一个脚本文件比如叫myscript.sh用文本编辑器打开第一行我们几乎总是会写#!/bin/bash这行被称为“Shebang”或“Hashbang”。它不是注释而是告诉系统当直接运行这个脚本文件时应该用哪个解释器来执行文件内的命令。/bin/bash指定了使用Bash这个Shell。为什么是Bash因为它是在Linux和macOS上最通用、功能最强大的Shell。虽然还有/bin/sh通常是Bash的简化模式或Dash但为了使用Bash丰富的特性如数组、更强大的条件判断我们通常明确指定它。注意在某些极简的Docker镜像或嵌入式系统中可能只有/bin/sh。如果你的脚本要在这种环境下运行要么使用更通用的#!/bin/sh并在编写时严格遵循POSIX标准避免使用Bash特有语法要么在构建镜像时确保安装bash。2.2 如何让一个文本文件变成可执行程序写完脚本后你直接输入./myscript.sh很可能会收到“Permission denied”的错误。这是因为新建的文件默认没有执行权限。在Unix/Linux哲学中权限是需要明确赋予的。你需要执行chmod x myscript.sh这条命令给文件myscript.sh的所有者、组和其他用户都添加了执行(x)权限。chmod是“change mode”的缩写x就是增加执行权。之后你就可以通过./myscript.sh来运行它了。这里的./表示当前目录是必需的因为出于安全考虑系统通常不会将当前目录加入命令搜索路径(PATH)。2.3 脚本执行的三种方式及其本质区别作为可执行文件运行./myscript.sh这是最标准的方式。系统读取Shebang行找到/bin/bash然后启动一个新的Bash子进程由这个子进程来执行脚本中的命令。脚本中的变量、函数等都在这个子Shell中生效执行完毕后子Shell退出其内部状态不会影响父Shell即你当前的终端。使用解释器直接运行bash myscript.sh这种方式显式指定了解释器bash。此时脚本文件的第一行#!/bin/bash会被当作普通注释忽略。效果和第一种方式类似也是在新子Shell中运行。在当前Shell中运行Source. myscript.sh或source myscript.sh这种方式有本质不同。它不会启动子Shell而是让当前Shell直接读取并执行脚本文件中的命令。这意味着脚本中设置的环境变量会在当前Shell中生效。脚本中定义的函数可以在当前Shell中直接调用。脚本中使用cd命令会改变当前Shell的工作目录。 这种方式通常用于加载配置如.bashrc或者在调试脚本时需要让变量留在当前环境进行查看。理解这些区别至关重要。比如你写了一个脚本用来设置项目环境变量如果你用./setup.sh运行脚本结束变量就消失了你必须用source setup.sh才能让设置对当前终端生效。这是一个常见的“坑”。3. 变量、字符串与引号Shell编程的基石与陷阱3.1 变量的定义、使用与作用域在Bash中定义变量很简单但有一些严格的规则nameJohn Doe # 定义变量等号两边不能有空格 age30使用变量时需要在变量名前加美元符号$echo $name echo Hello, $name!为了明确变量名的边界避免歧义我们常用花括号将变量名括起来${name}。这在变量与其他字符连接时非常有用echo Hello, ${name}! # 清晰推荐 echo I am ${age}years old # 如果没有{}Shell会尝试寻找名为ageyears的变量作用域默认情况下在脚本中定义的变量是全局的在整个脚本内都有效。在函数内部如果你修改了一个全局变量修改会生效。如果你在函数内想创建一个局部变量需要使用local关键字function myfunc() { local local_varIm local global_varIm global }执行函数后local_var在函数外无法访问而global_var则可以在脚本任何地方访问。3.2 引号的艺术单引号、双引号与反引号引号是Shell脚本中最容易混淆的部分之一也是很多bug的来源。单引号强引用。引号内的所有字符都保持字面意义变量和命令替换都不会发生。echo $name is $age # 输出: $name is $age双引号弱引用。引号内的大部分字符保持字面意义但变量替换和命令替换会正常进行。echo $name is $age # 输出: John Doe is 30反引号和$()命令替换。它们用于执行一条命令并将其输出结果替换到当前位置。$()是更现代、更推荐的方式因为它更清晰且可以嵌套。current_datedate # 旧式不推荐嵌套 current_date$(date) # 新式清晰且可嵌套如$(echo $(date)) echo Today is $current_date一个黄金法则除非你有明确理由需要使用单引号比如需要原样输出$符号否则在定义包含变量的字符串时总是使用双引号。这可以避免很多因单词分割和通配符扩展导致的意外错误。file_path/path with spaces/my file.txt # 错误示范 rm $file_path # 这会被解析为 rm /path with spaces/my file.txt试图删除四个不存在的文件可能引发灾难 # 正确示范 rm $file_path # 引号保证了变量值作为一个整体参数传递3.3 环境变量、位置参数与特殊变量环境变量像PATH,HOME,USER这些由Shell或系统预设的变量可以被所有子进程继承。在脚本中你可以直接读取它们也可以用export命令将自定义变量提升为环境变量供子进程使用。echo My home directory is $HOME export MY_TOOL_PATH/opt/mytool # 之后在脚本中启动的子进程就能读取到MY_TOOL_PATH了位置参数当通过命令行向脚本传递参数时这些参数可以通过$1,$2,$3...来访问。$0代表脚本本身的名称。# 假设脚本调用./myscript.sh arg1 arg2 echo Script name: $0 echo First arg: $1 echo Second arg: $2特殊变量$#传递给脚本的参数个数。$所有位置参数的列表每个参数作为独立的单词通常配合循环使用。$*所有位置参数但被合并成一个单独的字符串。$?上一条命令的退出状态码。0通常表示成功非0表示失败。这是进行条件判断的关键。$$当前Shell进程的进程IDPID。$!最后一个在后台运行的进程的PID。4. 流程控制让脚本学会判断与循环4.1 条件判断if/else/fi 与 test命令Shell脚本使用if、then、else、elif、fi来进行条件分支。判断的核心是一个“条件测试”它实际上是一条命令根据其退出状态码$?是否为0来判断真假。有两种常用的测试语法test命令及其简写[ ]if test -f /path/to/file; then echo File exists. fi # 等价于更常见的方括号写法注意括号内的空格是必须的 if [ -f /path/to/file ]; then echo File exists. fi更强大的[[ ]]这是Bash的扩展语法比[ ]更安全、功能更强支持正则匹配~且字符串比较更直观。if [[ -f /path/to/file ]]; then echo File exists. fi if [[ $name John ]]; then # 使用进行字符串比较比[ ]的更直观 echo Hello, John! fi常见的测试运算符类别运算符含义示例文件测试-e file文件/目录是否存在[ -e /tmp ]-f file是否为普通文件[ -f /etc/passwd ]-d file是否为目录[ -d /home ]-r file文件是否可读[ -r data.txt ]-w file文件是否可写[ -w log.txt ]-x file文件是否可执行[ -x myscript.sh ]字符串测试-z str字符串长度是否为0[ -z $var ]-n str字符串长度是否非0[ -n $var ]str1 str2字符串相等[ $a $b ]str1 ! str2字符串不等[ $a ! $b ]算术比较num1 -eq num2等于 (equal)[ $a -eq 10 ]num1 -ne num2不等于 (not equal)[ $a -ne 0 ]num1 -gt num2大于 (greater than)[ $a -gt $b ]num1 -lt num2小于 (less than)[ $a -lt 100 ]num1 -ge num2大于等于[ $a -ge 1 ]num1 -le num2小于等于[ $a -le 10 ]逻辑组合! expr非[ ! -f file ]expr1 -a expr2与 (and)[ -f file -a -r file ]expr1 -o expr2或 (or)[ -z $var -o $var yes ]推荐逻辑与 (命令执行成功)[[ -f file -r file ]]实操心得对于字符串判断务必先检查变量是否为空或者始终将变量放在双引号内。[ -n $var ]在var为空时会变成[ -n ]这会被解释为测试字符串“-n”是否非空结果为真导致逻辑错误。正确的写法是[ -n $var ]。这也是我更推荐使用[[ ]]的原因之一它对未定义变量的处理稍宽容一些。4.2 循环结构for、while 与 until循环是自动化的核心。for循环常用于遍历一个已知的列表。# 遍历值列表 for fruit in apple banana orange; do echo I like $fruit done # 遍历命令输出结果例如文件列表 for file in *.txt; do echo Processing $file # 可以对每个.txt文件进行操作 done # C语言风格的for循环用于数字序列 for (( i1; i5; i )); do echo Iteration $i donewhile循环当条件为真时持续循环。count1 while [ $count -le 5 ]; do # 使用[ ]测试 echo Count is $count ((count)) # 使用双括号进行算术运算 done # 逐行读取文件内容非常实用的模式 while IFS read -r line; do echo Line: $line done input.txt # 输入重定向到循环这里IFS是为了防止行首行尾的空白被修剪-r选项防止反斜杠被解释。until循环与while相反当条件为假时持续循环直到条件为真。相对较少使用。count1 until [ $count -gt 5 ]; do echo Count is $count ((count)) done4.3 分支选择case 语句当需要根据一个变量的多种可能值进行分支时case语句比一堆if/elif更清晰。fruitbanana case $fruit in apple) echo Its an apple. ;; banana | mango) # 可以匹配多个模式用|分隔 echo Its a tropical fruit. ;; orange) echo Its an orange. ;; *) # 默认情况匹配任何值 echo Unknown fruit. ;; esac每个分支以;;结束代表break。5. 函数、输入输出与脚本调试5.1 函数的定义与调用封装可重用逻辑函数让你可以把一段常用的代码块封装起来提高脚本的模块化和可读性。# 定义函数 greet_user() { local name$1 # 使用局部变量 local hour$(date %H) if [ $hour -lt 12 ]; then echo Good morning, $name! elif [ $hour -lt 18 ]; then echo Good afternoon, $name! else echo Good evening, $name! fi } # 调用函数并传递参数 greet_user Alice函数内通过$1,$2...来访问传递的参数。使用local定义变量可以避免污染全局命名空间。函数也可以有返回值但严格来说Shell函数返回的是退出状态码0成功非0失败。如果需要返回一个字符串值通常的做法是用echo输出然后在调用处用命令替换捕获get_full_path() { local filename$1 echo $(pwd)/$filename } my_path$(get_full_path data.txt)5.2 与用户交互read命令与菜单让脚本变得交互式很简单使用read命令。echo -n Please enter your name: # -n 表示不换行 read username echo Hello, $username! # 读取多个值 echo Enter your first and last name: read firstname lastname echo First: $firstname, Last: $lastname # 静默读取用于密码 read -s -p Enter your password: password echo # 换行 # -s 表示不显示输入-p 允许直接指定提示符 # 带超时的读取 if read -t 10 -p You have 10 seconds to respond: answer; then echo You said: $answer else echo Time out! fi5.3 脚本的输入输出重定向这是Shell脚本强大功能之一它允许你控制命令的数据来源和去向。和输出重定向。覆盖文件追加到文件。echo Hello output.txt # 创建或覆盖output.txt date output.txt # 将日期追加到output.txt末尾输入重定向。将文件内容作为命令的输入。wc -l input.txt # 统计input.txt的行数2和标准错误重定向。命令的输出分为标准输出(stdout, 文件描述符1)和标准错误(stderr, 文件描述符2)。ls non_existent_file 2 error.log # 将错误信息重定向到error.log ls *.txt all_output.log # 将stdout和stderr都重定向到同一个文件管道|将一个命令的标准输出作为下一个命令的标准输入。ps aux | grep nginx | head -5 # 列出进程过滤出nginx相关的前5条5.4 调试技巧让错误无处遁形写脚本难免出错掌握调试方法能极大提升效率。启用调试模式bash -x script.sh在运行脚本时打印出每一行被执行的命令及其扩展后的参数。这是最强大的调试工具。在脚本内部第一行Shebang之后添加set -x同样可以启用调试。用set x关闭。启用严格模式在脚本开头加上以下两行是好习惯。#!/bin/bash set -euo pipefailset -e一旦任何命令执行失败返回非0状态脚本立即退出。set -u遇到未定义的变量时报错并退出。set -o pipefail管道命令中只要有一个命令失败整个管道就视为失败。 这能防止错误像雪球一样滚大让你尽早发现并定位问题。打印调试信息在关键位置使用echo或printf输出变量状态。echo DEBUG: The value of var is: $var 2 # 重定向到标准错误不影响正常输出流使用 shellcheck这是一个静态分析工具可以检查Shell脚本中的语法错误、不规范的写法以及潜在的bug。强烈建议在编写脚本后使用shellcheck your_script.sh进行检查它能发现很多肉眼难以察觉的问题。6. 实战进阶文本处理三剑客与综合案例Shell脚本的强大一半来自于Shell本身另一半则来自于Unix系统下那些小巧而强悍的文本处理工具其中最著名的就是grep、sed、awk常被称为“三剑客”。6.1 grep全局正则表达式打印用于搜索过滤grep用于在文件或输入流中搜索匹配特定模式的行。基本搜索grep pattern file.txt忽略大小写grep -i error log.txt显示行号grep -n TODO source_code.py反向匹配grep -v ^# config.conf显示所有不以#开头的行常用于查看有效配置递归搜索grep -r function_name ./src/在当前目录及子目录中搜索使用扩展正则表达式grep -E error|warning|fatal log.txt匹配error或warning或fatal6.2 sed流编辑器用于文本替换与编辑sed以行为单位对文本进行替换、删除、插入等操作尤其擅长批量替换。基本替换sed s/old/new/ file.txt将每行第一个old替换为new全局替换sed s/old/new/g file.txt将每行所有的old替换为new直接修改原文件sed -i s/foo/bar/g file.txt-i选项直接修改文件务必先备份或测试删除行sed /^#/d file.txt删除所有以#开头的注释行打印特定行sed -n 10,20p file.txt只打印文件的第10到20行6.3 awk强大的文本分析工具也是一门编程语言awk将输入行分割成字段默认以空格或制表符分隔然后对字段进行处理。它功能极其强大。打印特定列awk {print $1, $3} data.txt打印第1列和第3列指定分隔符awk -F, {print $2} csvfile.csv使用逗号,作为分隔符条件过滤awk $3 100 {print $1, $3} data.txt打印第3列大于100的行的第1、3列内置变量NF字段数NR当前行号$0整行内容。awk {print NR : $0} file.txt # 给每一行加上行号 awk NF 5 file.txt # 打印字段数大于5的行常用于过滤空行或简单行进行计算awk {sum $1} END {print sum} numbers.txt计算第一列的总和6.4 综合实战案例服务器日志分析脚本假设我们有一个Nginx的访问日志文件access.log格式类似192.168.1.1 - - [10/May/2024:15:30:01 0800] GET /index.html HTTP/1.1 200 1234我们需要写一个脚本analyze_log.sh实现以下功能统计总访问次数。找出访问量最高的前5个IP地址。统计所有非200状态码的请求及其数量。#!/bin/bash # analyze_log.sh - 简易Nginx日志分析脚本 set -euo pipefail LOG_FILE${1:-access.log} # 使用第一个参数作为日志文件默认为access.log if [[ ! -f $LOG_FILE ]]; then echo 错误日志文件 $LOG_FILE 不存在。 2 exit 1 fi echo 日志分析报告 echo 分析文件: $LOG_FILE echo 生成时间: $(date) echo echo # 1. 统计总访问次数 total_requests$(wc -l $LOG_FILE) echo 1. 总访问次数: $total_requests echo # 2. 找出访问量最高的前5个IP (假设IP在第一列) echo 2. 访问量TOP 5的IP地址: awk {print $1} $LOG_FILE | sort | uniq -c | sort -rn | head -5 echo # 3. 统计非200状态码的请求 (假设状态码在第9列) echo 3. 非200状态码请求统计: awk $9 ! 200 {print $9} $LOG_FILE | sort | uniq -c | sort -rn echo echo 分析完成。脚本解析与技巧参数处理${1:-access.log}是一种参数默认值写法。如果执行脚本时提供了第一个参数如./analyze_log.sh my.log则LOG_FILE为my.log如果没提供则默认为access.log。文件存在性检查在操作文件前先检查它是否存在是好习惯。核心管道分析awk {print $1}提取第一列IP地址。sort对IP进行排序这是uniq -c统计相邻重复行出现次数的前提。uniq -c统计每个IP出现的次数输出格式如“5 192.168.1.1”。sort -rn按数字(-n)逆序(-r)排序即按访问次数从高到低排。head -5取前5行。错误输出重定向2将错误信息输出到标准错误方便与正常分析结果区分。你可以通过运行chmod x analyze_log.sh和./analyze_log.sh来使用这个脚本。这个案例融合了变量、参数、条件判断、管道和文本处理三剑客是一个典型的Shell脚本应用场景。7. 避坑指南与最佳实践结合我多年的经验下面这些“坑”和最佳实践能让你的脚本更健壮、更专业。7.1 必须养成的安全习惯总是给变量加双引号这是防止空白字符和路径名扩展导致错误的最重要规则。rm $file永远比rm $file安全。使用set -euo pipefail在脚本开头加上这行能让脚本在遇到错误、未定义变量或管道失败时立即停止而不是继续执行并产生更糟糕的结果。对输入进行验证特别是当脚本需要处理用户输入或外部参数时。检查文件是否存在、参数数量是否正确、输入格式是否合法。慎用rm -rf在变量和路径拼接时尤其要小心。可以考虑先使用rm -rf的“模拟”模式或者先echo出要删除的命令确认无误后再执行。# 危险 dir_to_clean/tmp/important rm -rf $dir_to_clean/* # 如果变量意外为空命令变成 rm -rf /* 将是灾难 # 稍好的做法 [[ -n $dir_to_clean ]] rm -rf ${dir_to_clean:?}/* # 使用:?运算符如果变量为空或未设置会报错退出。7.2 提升脚本的可读性与可维护性添加注释在复杂的逻辑块、函数定义、重要的变量声明处添加注释说明其目的。但避免对显而易见的代码进行注释。使用有意义的变量名backup_dir比bd好max_retry_count比mrc好。定义函数将重复的代码或独立的逻辑块封装成函数。一个函数最好只做一件事。使用local变量在函数内部始终使用local声明变量避免副作用。统一的代码风格缩进通常用2或4个空格、括号位置保持统一。虽然Shell对缩进不敏感但良好的格式对阅读者至关重要。7.3 性能与可移植性考量避免在循环中使用管道调用外部命令特别是在处理大量数据时。例如在循环内反复调用grep或awk可能很慢。尽量将数据一次性通过管道传递给这些工具处理。使用$(command)代替反引号$()更清晰且支持嵌套。注意可移植性如果你的脚本需要在不同的Unix-like系统如Linux, macOS, BSD上运行要小心使用某些Bash特有的特性如[[ ]],~。对于需要高度可移植的脚本坚持使用POSIX标准的[ ]和test命令。处理带有特殊字符的文件名使用find命令的-print0和xargs的-0选项或者使用while IFS read -r -d 循环来处理可能包含空格、换行符的文件名。7.4 一个健壮的脚本模板最后分享一个我常用的、相对健壮的脚本开头模板它集成了很多最佳实践#!/usr/bin/env bash # 脚本名称robust_script_template.sh # 描述一个健壮的Shell脚本模板 # 用法./script_template.sh [选项] 参数 set -euo pipefail # 启用严格模式 # 初始化变量 readonly SCRIPT_NAME$(basename $0) readonly SCRIPT_DIR$(cd $(dirname $0) pwd) # 获取脚本所在目录 VERSION1.0.0 VERBOSEfalse # 颜色定义用于输出非必需 readonly RED\033[0;31m readonly GREEN\033[0;32m readonly YELLOW\033[1;33m readonly NC\033[0m # No Color # 函数定义 usage() { cat EOF Usage: $SCRIPT_NAME [OPTIONS] input_file Options: -h, --help Display this help message and exit. -v, --verbose Enable verbose output. -V, --version Display version information. Example: $SCRIPT_NAME --verbose data.txt EOF } log_info() { echo -e ${GREEN}[INFO]${NC} $* } log_warn() { echo -e ${YELLOW}[WARN]${NC} $* 2 } log_error() { echo -e ${RED}[ERROR]${NC} $* 2 } # 主逻辑 main() { local input_file # 解析命令行参数 while [[ $# -gt 0 ]]; do case $1 in -h|--help) usage exit 0 ;; -v|--verbose) VERBOSEtrue shift ;; -V|--version) echo $SCRIPT_NAME version $VERSION exit 0 ;; -*) log_error Unknown option: $1 usage exit 1 ;; *) input_file$1 shift ;; esac done # 参数验证 if [[ -z $input_file ]]; then log_error Input file is required. usage exit 1 fi if [[ ! -f $input_file ]]; then log_error Input file $input_file does not exist or is not a regular file. exit 1 fi $VERBOSE log_info Starting processing of $input_file... # 这里是你的脚本核心业务逻辑 process_file $input_file $VERBOSE log_info Processing completed successfully. } # 具体的处理函数 process_file() { local file$1 log_info Processing file: $file # ... 实现具体的处理逻辑 ... } # 脚本入口 main $这个模板包含了严格的错误处理、清晰的用法说明、命令行参数解析、日志函数和基本的代码结构。从这样一个坚实的基础开始编写脚本能帮你避开很多初级错误也让你的脚本看起来更专业、更可靠。记住Shell脚本的终极目标不是炫技而是可靠、清晰、高效地解决问题。

相关新闻

电力场景耐张线夹腐蚀与鸟巢检测数据集VOC+YOLO格式267张2类别有增强

电力场景耐张线夹腐蚀与鸟巢检测数据集VOC+YOLO格式267张2类别有增强

注意数据集大约1/3是原图剩余为增强图片具体看图片数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):267标注数量(xml文件个数):267…

2026/8/16 22:12:24 阅读更多 →
OpenClaw:基于“龙虾架构”的智能体开发平台,原生飞书集成与技能化实践

OpenClaw:基于“龙虾架构”的智能体开发平台,原生飞书集成与技能化实践

1. 项目概述:从“龙虾架构”说起 最近在GitHub上,一个名为“OpenClaw”的项目彻底火了,短短时间内就斩获了超过35k的Star,讨论热度居高不下。这个项目最吸引人的标签,莫过于“字节版龙虾架构”。第一次听到这个名字&a…

2026/8/15 21:33:12 阅读更多 →
Node 后端实战 · JWT 双密钥轮转与 token 版本号:多租户 SaaS 如何不停机换密钥、一键踢全设备

Node 后端实战 · JWT 双密钥轮转与 token 版本号:多租户 SaaS 如何不停机换密钥、一键踢全设备

Node 后端实战 JWT 双密钥轮转与 token 版本号:多租户 SaaS 如何不停机换密钥、一键踢全设备 各位看官,做多租户 SaaS 后端,认证是地基里的地基。地基没打牢,上面盖再多业务功能都是危房。我这个后端跑在 Cloudflare Workers 上…

2026/8/16 0:09:41 阅读更多 →

最新新闻

Docker Compose部署BookStack:快速搭建私有知识库的完整指南

Docker Compose部署BookStack:快速搭建私有知识库的完整指南

1. 项目缘起:为什么选择BookStack来搭建个人知识库? 最近在整理手头积累的技术笔记、项目文档和零散想法时,我越来越觉得需要一个统一的、结构化的地方来存放它们。尝试过各种笔记软件,从Notion到Obsidian,各有各的好…

2026/8/16 23:26:49 阅读更多 →
HAR文件全解析:从网络请求诊断到前端性能优化的实战指南

HAR文件全解析:从网络请求诊断到前端性能优化的实战指南

1. 从一次线上故障排查说起:HAR文件如何成为“破案”关键那天下午,团队里负责前端的小王急匆匆地跑过来,说线上一个核心表单的提交成功率突然从99.9%跌到了70%左右,用户反馈点了提交按钮没反应。监控系统只显示接口超时&#xff0…

2026/8/16 23:26:49 阅读更多 →
HAR文件全解析:从HTTP存档到网络调试与性能分析实战

HAR文件全解析:从HTTP存档到网络调试与性能分析实战

1. 项目概述:从“黑盒”到“白盒”的调试利器如果你是一名前端开发者、测试工程师,或者经常需要和网站、接口打交道,那么你一定对浏览器开发者工具(F12)不陌生。但你是否曾遇到过这样的场景:一个偶发的线上…

2026/8/16 23:26:49 阅读更多 →
从ARP协议到Proxy ARP:网络地址解析原理、实战与安全深度解析

从ARP协议到Proxy ARP:网络地址解析原理、实战与安全深度解析

1. 从一次诡异的“网络不通”说起 那天下午,运维同事小张急匆匆地跑过来,说新上线的测试环境里,有两台服务器A和B,明明IP地址配置正确,网关也指向了同一个三层交换机,但A就是死活ping不通B。更诡异的是&…

2026/8/16 23:26:49 阅读更多 →
从零构建去中心化交易所(DEX)DEMO:完整技术实现指南

从零构建去中心化交易所(DEX)DEMO:完整技术实现指南

引言 构建一个去中心化交易所(DEX)是从零理解DeFi世界的最佳实践路径。本文将完整记录从合约设计、核心模块开发到前端集成的全过程,基于Uniswap V2架构实现一个功能完整的DEX DEMO,涵盖AMM交易模型、流动性池、Swap交易逻辑、Ro…

2026/8/16 23:25:48 阅读更多 →
Windows批处理脚本:从零到精通的自动化利器

Windows批处理脚本:从零到精通的自动化利器

1. 从“黑框框”到效率神器:Windows批处理脚本的现代解读 如果你用过Windows电脑,大概率见过那个黑底白字的“命令提示符”窗口。很多人觉得它神秘又有点吓人,是“高手”或者“搞破坏”的人才用的东西。但你可能不知道,这个看似古…

2026/8/16 23:25:48 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →