Linux Shell脚本基础语法入门:变量、判断、循环与函数实战指南
很多人在Linux上折腾了一段时间后都会走到一个岔路口命令行已经用得挺顺了但遇到重复性操作还是只能一遍遍手敲。这时候shell编程就成了绕不开的坎。我见过不少朋友一上来就啃语法书结果被各种符号和关键字搞得晕头转向最后放弃了。其实shell编程的基础语法没那么玄乎核心就那几样东西变量、判断、循环、函数。把这些搞通了日常的批量处理、自动化任务、日志分析基本都能应付。这篇就来聊聊shell编程的基础语法适合刚学完Linux基本命令、想开始写脚本但又不知道从哪下手的朋友。我会把变量、引号、特殊变量、条件判断、循环、函数这些基础语法掰开揉碎讲清楚每个知识点都会配上实际场景尽量让你看完就能上手写脚本。这篇是按照一个系列的方式来写的叫“Linux系统学习01”后续还会有其他主题但这一篇先把地基打好。1. 先搞清楚shell脚本到底在干嘛1.1 脚本不是玄学就是把命令排好队你想过没有shell脚本的本质到底是什么说白了它就是把你在终端里手动敲的那些命令按照一定的逻辑顺序写进一个文件里然后让系统帮你一条条执行。你可以把它理解成一张“命令流水线作业单”第一步干什么、第二步干什么、遇到什么情况走哪条路、重复干几遍全都提前规定好。但脚本和“把命令堆在一起”还有一个本质区别它多了“逻辑”。比如你要备份某个目录手动操作就是cp一下完事。但写成脚本你就可以加上判断“目录存在才备份不存在就报错退出”“备份文件超过7天的自动删除”。这些判断和循环就是编程的部分也是脚本真正有价值的所在。我刚学shell的时候有个误区总想一次性把所有语法学完再动手写。结果就是越学越乱因为语法之间是相互关联的你不真正用起来光看根本记不住。后来我换了个思路先写一个最简单的脚本跑通再一点点往里面加判断、加循环在真实需求中逐步掌握语法。这个思路比死磕语法书高效太多了强烈推荐你也试试。1.2 一个最简单的脚本长什么样先从一个你肯定见过的例子说起。打开终端创建一个文件比如叫first.sh然后往里写三行内容#!/bin/bash # 这是我的第一个shell脚本 echo Hello, Shell!保存退出后给它加上执行权限chmod x first.sh然后运行./first.sh终端就会打印出Hello, Shell!。别小看这个例子它已经包含了一个shell脚本最核心的三个组成部分解释器声明#!/bin/bash、注释#开头的那行、实际命令echo那一行。能把这个跑通说明你的环境没问题后续的语法学习就都有地方可以验证了。1.3 第一行#!到底有什么用很多教程都会让你写#!/bin/bash但很少解释为什么。这里多说两句#!叫shebang它的作用是告诉系统这个脚本应该用哪个解释器来执行。你写的是/bin/bash就是用bash来跑如果写#!/bin/sh就是用系统的默认shell来跑如果写#!/usr/bin/env python3就是用Python来跑。有个细节值得注意现在的Linux发行版默认shell大多是bash但sh往往是指向bash的软链接行为上会有些细微差别。所以我个人建议新写的脚本统一用#!/bin/bash少踩一些兼容性的坑。另外有些朋友写脚本时不加这一行直接bash first.sh也能跑但这属于绕过了脚本自身的解释器声明一旦你把脚本放到别的环境或者改成直接执行的方式就可能出问题。养成好习惯第一行就写上。1.4 执行脚本的几种姿势与权限问题执行shell脚本有几种方式它们之间的区别值得搞清楚。./script.sh这是最标准的执行方式要求脚本有执行权限chmod x而且脚本开头要有正确的shebang。bash script.sh用bash解释器直接执行不需要执行权限只要读权限就行。这种方式会忽略脚本里shebang指定的解释器强制用你命令里指定的bash来跑。source script.sh或. script.sh这种方式比较特殊它是在当前shell进程中执行脚本而不是开一个子shell。这意味着脚本里定义的变量、修改的环境在脚本执行完后依然保留在当前终端里。这个特性在你需要临时修改环境变量时非常有用。我遇到过不少新手写完脚本后直接./script.sh结果报错Permission denied第一反应是脚本写错了。其实不是就是没加执行权限。还有更隐蔽的问题假设你的脚本文件是在Windows上编辑的带着CRLF换行符在执行时就会报bad interpreter之类的错这个后面讲常见问题时细说。2. 变量与引号shell的“存储箱”和“保险丝”2.1 变量的定义、使用与命名规则shell里的变量本质上就是一个“存储箱”用来暂存数据。定义一个变量非常简单直接写名字和值就行name张三 age25这里有几个新手最容易踩的坑我一个个说。第一等号两侧绝对不能有空格。这个奇葩规则坑了无数人。在其他编程语言里name 张三是标准写法但在shell里这样写会被解析成执行一个叫name的命令参数是和张三结果就是报错command not found。我刚学shell的时候就因为这个规则怀疑了自己半天。第二使用变量时要在变量名前面加$。定义的时候不需要$但用的时候必须加。比如echo 我的名字是${name} echo 我今年$age岁这个$就是告诉shell我要取这个变量的值而不是把它当普通字符串。第三变量名有命名规则。只能由字母、数字、下划线组成而且不能以数字开头。虽然shell本身对变量名的要求不算严但千万别起名叫1abc这种那是给自己找麻烦。另外环境变量通常用全大写的名字比如PATH、HOME你自己定义的局部变量建议用小写或混合大小写这样一眼就能区分哪些是系统的、哪些是自己定义的。第四引用变量时最好用花括号包起来写成${name}。这会在一些拼接场景下避免歧义。比如你想输出“我的名字是张三先生”写成echo 我的名字是$name先生shell会尝试找一个名叫name先生的变量结果什么也输出不了。但写成${name}先生就完全没问题。2.2 单引号、双引号和反引号的区别引号是shell新手绕不过去的一道坎因为三种引号的含义完全不同用错了结果天差地别。双引号里面的变量会被替换成实际值但大部分特殊字符会失去原本的含义。比如name张三 echo 你好$name # 输出你好张三单引号里面的所有内容都原样输出变量不会被替换连转义符都不起作用。比如name张三 echo 你好$name # 输出你好$name反引号或者$()里面的内容会被当成命令来执行执行的结果作为整个表达式的值。比如echo 今天是$(date %F) # 输出今天是2025-05-20 echo 今天是date %F # 输出效果一样但更推荐上面的写法为什么更推荐$()而不是反引号因为反引号在嵌套的时候非常容易出错可读性也差。$()天然支持嵌套比如echo 当前目录下有$(ls | wc -l)个文件这个写法的逻辑就很清晰。在实际写脚本的时候我总结了一个简单的选择标准想输出变量值就用双引号想原样输出特殊字符就用单引号想让命令结果参与运算就用$()。搞清楚这三种引号的特性很多莫名其妙的问题就消失了一半。2.3 位置参数$0、$1、$2与特殊变量很多脚本不是写死了的而是需要在使用时传入不同的参数。比如你写了一个备份脚本希望执行时能指定“备份哪个目录”那就要用到位置参数了。#!/bin/bash echo 脚本名$0 echo 第一个参数$1 echo 第二个参数$2 echo 参数个数$# echo 所有参数$假设执行./test.sh a b输出就会依次是脚本名./test.sh、第一个参数a、第二个参数b、参数个数2、所有参数a b。这些特殊变量是shell内置的了解它们能极大提升脚本的灵活性$0脚本自身的名字$1到$9第1到第9个位置参数$#参数个数$所有参数每个参数独立$*所有参数整体作为一个字符串$?上一个命令的退出状态码0表示成功非0表示失败$$当前shell的进程ID$和$*的区别比较隐蔽但很重要。假设你有三个参数a b c d写成$会得到三个独立的参数a b、c、d写成$*会得到一个字符串a b c d。在涉及循环遍历参数时用$更安全它能保留参数内部的空格。有一个细节很多新手会忽略当你的参数超过9个时第10个不能写成$10要写成${10}。原因很简单$10会被解析成$1加上一个字符0。2.4 退出状态码$?隐藏的调试利器Linux下每个命令执行完都会返回一个退出状态码exit code0代表成功非0代表失败。这个状态码被存进特殊变量$?里你可以在命令执行后立刻查看。ls /tmp echo $? # 如果输出0说明命令成功 ls /nonexistent echo $? # 如果输出非0说明命令失败常见是2这个$?在脚本里用处很大。你可以根据上一个命令的成败决定后续流程也可以在一些错误发生后及时退出脚本避免“带病运行”。实际调试脚本时我经常在关键步骤后面临时加一句echo exit code: $?快速定位是哪一步出的问题定位完再删掉。这个习惯帮我解决过不少莫名其妙的脚本问题。3. 条件判断让脚本学会“看情况办事”3.1 test、[]与[[]]的区别与选择条件判断是脚本的“大脑”没有判断的脚本只是机械地依次执行命令。shell里做条件判断常见有三种写法test命令、方括号[]、双方括号[[]]。test是一种命令它执行后不会输出内容而是通过退出状态码来表示判断结果。比如test -f /etc/passwd echo 文件存在[其实是test的别名但用的时候要在表达式末尾加一个]表示结束[ -f /etc/passwd ] echo 文件存在[[ ]]是bash的扩展写法比前两者更强大、更安全条件里可以支持、||这些逻辑运算符对空变量、特殊字符的处理也更友好。比如name [[ -n $name ]] echo 变量非空 || echo 变量为空我个人强烈建议新脚本一律用[[ ]]。原因很简单[]对空变量特别敏感变量没加引号时容易报语法错而[[ ]]天生就处理好了这些问题。当然如果你的脚本要用sh这种POSIX shell跑[[就不支持了那你只能老老实实用[]。但是既然前面建议统一bash那就直接用[[ ]]省心。3.2 文件判断、字符串判断和数值比较条件判断按照作用对象主要分成三类文件判断、字符串判断、数值比较。它们各自有一堆运算符不用硬记写多了自然就熟了。我把最常用的整理成一个表类型运算符含义文件判断-f是否为普通文件文件判断-d是否为目录文件判断-e是否存在文件判断-x是否可执行文件判断-r是否可读文件判断-w是否可写字符串判断-z字符串长度是否为0字符串判断-n字符串长度是否非0字符串判断字符串是否相等字符串判断!字符串是否不相等数值比较-eq数值相等数值比较-ne数值不相等数值比较-gt大于数值比较-lt小于数值比较-ge大于等于数值比较-le小于等于这里有个特别容易记混的点字符串比较用数值比较用-eq。把这两个搞混的人太多了因为其他编程语言里数值比较直接用或但shell里数值比较有一套自己的运算符。举个实际场景。写一个检查输入参数是否为目录的脚本#!/bin/bash if [[ -d $1 ]]; then echo $1 是一个目录 else echo $1 不是目录或者不存在 fi再比如判断用户输入的数字是否大于10#!/bin/bash read -p 请输入一个数字 num if [[ $num -gt 10 ]]; then echo 你输入的数字大于10 elif [[ $num -eq 10 ]]; then echo 刚好等于10 else echo 小于10 fi注意一个细节read是一个内建命令用来读取用户输入-p参数后面跟的是提示文本。很多教程都会用到但不会解释它这里顺便说清楚。3.3 if、elif、else的完整分支写法shell里的if语法跟其他语言大同小异但有一个独特的点条件判断的结束要以fi就是if倒过来写来标记。完整的结构如下if [[ 条件1 ]]; then # 条件1成立时执行的代码 elif [[ 条件2 ]]; then # 条件2成立时执行的代码 else # 以上条件都不成立时执行的代码 fi这里要注意的是then和条件之间必须用分号或换行隔开。如果你把then另起一行写那if这一行结尾的分号就可以省略if [[ 条件1 ]] then echo 条件成立 fi两种写法都合法看你喜欢哪种风格。我习惯用分号写法一行一个条件整段代码结构更紧凑。一个实用的场景根据参数个数判断用法并提示用户。#!/bin/bash if [[ $# -eq 0 ]]; then echo 用法$0 文件名 exit 1 elif [[ ! -f $1 ]]; then echo 错误文件不存在或不是普通文件 exit 1 else echo 开始处理文件$1 fi这个脚本就是用到了前面讲的$#、$1、-f判断以及exit退出。exit 1表示以“失败”状态退出脚本这个状态码可以被调用这个脚本的其他程序感知到。3.4 case多分支选择的清流当分类情况比较多用if-elif-else链会很冗长而且不容易维护。这时候就该用case了。它的语法结构是case $变量名 in 模式1) 命令 ;; 模式2) 命令 ;; *) 默认命令 ;; esac注意结尾的esac——又是case的反写跟if/fi一个套路。每个分支后面要有两个分号;;表示这一分支的结束。举个实际例子根据用户输入的水果名输出对应的价格#!/bin/bash read -p 请输入水果名苹果/香蕉/橙子 fruit case $fruit in 苹果) echo 苹果 5元/斤 ;; 香蕉) echo 香蕉 3元/斤 ;; 橙子) echo 橙子 6元/斤 ;; *) echo 抱歉没有这个水果的信息 ;; esaccase还有一些强大的玩法比如支持用|把多个模式合并到同一个分支case $fruit in 苹果|梨) echo 常见水果 ;; *) echo 其他水果 ;; esac还支持用通配符匹配case $1 in start|restart) echo 启动服务 ;; stop) echo 停止服务 ;; *) echo 用法$0 {start|stop|restart} ;; esac这种写法在写服务管理脚本时非常常见可读性比一长串if-elif强不少。4. 循环让重复劳动见鬼去吧4.1 for循环遍历列表、文件与命令结果循环是用来对付“重复”的shell脚本里最常用的是for循环。它的基本写法是for 变量 in 列表; do 命令 done这里有个非常反直觉的点循环结束时不是用end或者endfor而是用done。我第一次写的时候怎么都记不住因为这跟其他语言差别太大了。后来写多了也就习惯了。最基本的用法是遍历一个明确写出来的列表for name in 张三 李四 王五; do echo 你好$name done更实用的是结合命令的结果来遍历。比如遍历当前目录下所有的.txt文件for file in *.txt; do echo 找到文件$file done再比如逐行处理一个文件的内容for line in $(cat list.txt); do echo 读取到$line done这里有个坑要提醒用$(cat list.txt)遍历时如果文件每行有空格会按照空格把内容再拆开而不是按行处理。比如一行内容是hello world会被拆成两个独立项hello和world。这种情况下更稳妥的方式是用while循环配合read后面会讲到。for循环还有一个C语言风格的写法适合做数值递减或递增的循环for ((i1; i10; i)); do echo 第 $i 次循环 done这种写法在需要指定循环次数的时候非常方便。注意这种写法必须有两个括号里面的语法跟C语言很像。4.2 while循环条件为真就一直跑while循环的语法是while [[ 条件 ]]; do 命令 done只要条件成立就会一直循环直到条件不成立。写个例子从1加到100#!/bin/bash sum0 i1 while [[ $i -le 100 ]]; do sum$((sum i)) i$((i 1)) done echo 1加到100的结果是$sum这里用到了算术运算的写法$(( ))这是bash内置的整数运算方式里面可以直接写、-、*、/、%这些运算符。要注意的是赋值语句写成sum$((sum i))等号右侧的$(( ))就是“先计算再把结果赋给变量”。while循环还有一个特别实用的场景逐行读取文件。前面说了for循环按行读会踩空格的坑换成while加read就稳了while read -r line; do echo 读取到$line done list.txt这里的关键是 list.txt它把文件内容重定向到循环的输入里read每次读一行。-r参数表示不把反斜杠当成转义字符有时文件路径里有反斜杠不加-r就会被处理掉。4.3 until和循环控制符break、continueuntil和while长得像但逻辑正好反过来while是“条件为真时循环”until是“条件为真时停止”。也就是说until会一直循环直到条件满足才退出。i1 until [[ $i -gt 10 ]]; do echo $i i$((i 1)) done这个写法在“循环到某个条件满足为止”的场景下可读性更好。不过实际工作中while还是用得更多until偶尔用用。在循环体内部有两个重要的控制符break和continue。break立即跳出整个循环continue跳过本次循环的剩余部分直接进入下一次循环写个例子寻找第一个能被7整除的数for i in {1..100}; do if [[ $((i % 7)) -eq 0 ]]; then echo 找到了$i break fi done再比如打印1到10但跳过3的倍数for i in {1..10}; do if [[ $((i % 3)) -eq 0 ]]; then continue fi echo $i done这两个控制符在写复杂脚本时非常常用掌握它们能让循环逻辑更简洁。4.4 循环里的实战场景批量备份与重命名讲了这么多语法来一个综合的实战场景。假设你有一个目录里面有一堆日志文件命名格式是app-20250520.log。你想把扩展名改成.log.bak同时加上当前日期标记。#!/bin/bash backup_dirbackup_$(date %Y%m%d) mkdir -p $backup_dir for file in *.log; do newname${backup_dir}/${file%.log}_$(date %H%M%S).bak cp $file $newname echo 已备份$file - $newname done这里有几个知识点是新的顺手说说${file%.log}是变量截断的写法意思是去掉变量file结尾的.log部分$(date %Y%m%d)就是取当前日期格式是20250520这样的。这个脚本虽然只有几行但已经综合运用了变量、命令替换、循环、字符串处理、目录创建这些知识。类似这种“把重复操作封装成脚本”的思路用到实际工作中价值非常大。5. 函数与数组脚本的模块化与批量化5.1 函数的定义、调用与返回值当脚本越写越长代码开始重复时就该用函数了。函数的定义方式有两种function say_hello { echo Hello } # 或者更推荐的写法 say_hello() { echo Hello }调用函数很简单直接写函数名就行可以传参数#!/bin/bash greet() { echo 你好$1很高兴认识你。 } greet 张三 greet 李四函数里的$1等位置参数指的是传给函数的参数而不是传给脚本的参数容易搞混。如果函数里想用脚本的参数得先把脚本的参数存成普通变量再在函数里引用。函数的返回值有点特殊它不是用return返回一个计算结果而是返回一个退出状态码范围是0~255。一般情况下0表示函数执行成功非0表示失败。而函数里最后一条命令的执行结果会作为函数的返回值。所以如果你想返回一个计算结果比如计算两数之和不能用return只能通过echo输出然后在函数外面接收add() { local sum$(( $1 $2 )) echo $sum } result$(add 3 5) echo 结果是$result这种通过echo传递返回值、通过$( )接收的模式是shell里最常见的处理方式。5.2 函数中变量的作用域与local关键字默认情况下函数里定义的变量是全局变量也就是说函数执行完变量依然存在甚至可能覆盖掉脚本外面的同名变量。这很容易引发隐蔽的bug。解决方式就是在变量前加local关键字myfunc() { local temp内部变量 echo $temp }用local声明的变量只在函数内部有效函数执行完就销毁了不会去影响外面的同名变量。这是一个非常良好的习惯写函数时凡是用到的临时变量都加上local。我写了不少脚本发现很多诡异的问题都是变量相互污染导致的加上local之后这些问题基本都绝迹了。5.3 数组给变量加个“批量模式”变量存单个值数组存多个值。bash的数组用起来也不复杂常见的操作有这几样定义数组fruits(苹果 香蕉 橙子)访问单个元素注意下标从0开始echo ${fruits[0]} # 苹果 echo ${fruits[1]} # 香蕉访问所有元素、获取数组长度echo ${fruits[]} # 苹果 香蕉 橙子 echo ${#fruits[]} # 3给数组追加元素fruits(西瓜) echo ${fruits[]} # 苹果 香蕉 橙子 西瓜遍历数组for f in ${fruits[]}; do echo 水果$f done这里有个细节遍历数组时最好给${fruits[]}加上双引号这样能保证每个元素内部的空格被正确保留。不加引号碰到“红富士苹果”这种带空格的值就会拆成两个元素。数组在批量处理场景里特别好用。比如收集所有启动失败的服务名统一打印出来#!/bin/bash services(nginx mysql redis) failed() for s in ${services[]}; do if ! systemctl is-active --quiet $s; then failed($s) fi done if [[ ${#failed[]} -gt 0 ]]; then echo 以下服务启动失败${failed[]} fi5.4 综合示例写一个真正能用的环境巡检脚本把函数、数组、循环、条件判断串起来写一个简单的系统环境巡检脚本。它能检查CPU负载、磁盘空间、内存使用率并把异常项收集起来统一报告。#!/bin/bash check_disk() { local usage$(df -h / | awk NR2 {print $5} | tr -d %) if [[ $usage -gt 80 ]]; then echo 磁盘使用率过高${usage}% else echo 磁盘使用率正常${usage}% fi } check_mem() { local total$(free -m | awk NR2 {print $2}) local used$(free -m | awk NR2 {print $3}) local rate$(( used * 100 / total )) if [[ $rate -gt 90 ]]; then echo 内存使用率过高${rate}% else echo 内存使用率正常${rate}% fi } check_load() { local load$(uptime | awk -Fload average: {print $2} | cut -d, -f1) echo 系统负载$load } echo 开始巡检 check_disk check_mem check_load echo 巡检结束 这个脚本用到了df、free、uptime这些系统命令配合awk做文本解析。NR2表示取第二行$5表示第五列字段{print $5}就是打印第五个字段。这些文本处理工具跟shell组合使用能发挥巨大威力。6. 常见问题与排查技巧实录6.1 为什么我的脚本报“Permission denied”这个问题出现频率极高几乎每个新手都会遇到。原因很简单脚本没有执行权限。解决办法chmod x script.sh还有一种类似的情况就是脚本所在的文件系统以noexec方式挂载这种情况下哪怕你加了执行权限也没法直接执行。可以尝试把脚本复制到/tmp目录下运行或者用bash script.sh来绕过。6.2 为什么脚本在Windows上写的到Linux就跑不了这是个经典的坑。在Windows上用记事本或一些编辑器写脚本换行符是\r\nCRLF而Linux只认\nLF。多出来的那个\r会让脚本的第一行解析出问题最常见的报错是bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory解决办法是用sed或dos2unix把换行符转换过来sed -i s/\r$// script.sh # 或者 dos2unix script.sh我建议写脚本时尽量用支持LF换行的编辑器比如VS Code在右下角把换行符切换成LF就能从根源上避开这个问题。6.3 变量总是被“吃”掉、字符串拼接失败如果你遇到过这种情况echo 我的年龄是$age岁结果只输出了“我的年龄是”没显示后面的内容或者直接空白那十有八九是变量拼接的问题。解决办法就是给变量名加上花括号echo 我的年龄是${age}岁养成这个习惯能省不少排查时间。6.4 set -x让脚本“直播”执行过程最后分享一个调试利器set -x。在脚本开头加上这一行bash会实时打印出每一个执行的命令及其展开后的值。比如下面这个脚本#!/bin/bash set -x name张三 echo 你好$name执行时输出会显示 name张三 echo 你好张三每一行前面的表示这是正在执行的命令后面跟着的是展开后的实际内容。这样你就能一目了然地看到变量到底取没取到值、命令被解析成了什么样子、哪一步出了错。如果你不想改脚本也可以在执行时加参数bash -x script.sh还有个配套的set -e它会让脚本在遇到任何一个命令失败时立即退出避免错误一直蔓延下去适合在比较重要的任务脚本里使用。但-e不能乱用有时候某条命令的正常失败也会导致脚本提前退出所以要根据场景灵活取舍。6.5 常见问题速查表我把前面提到的常见问题汇总成一个表方便你对照排查症状常见原因解决方式Permission denied缺少执行权限chmod x script.shbad interpreter: ^MWindows CRLF换行sed -i s/\r$// script.shcommand not found变量赋值等号两侧有空格删掉空格输出为空双引号里$name后紧跟中文用${name}查询结果不对文件里有空行或空格用while read逐行处理脚本卡住不结束循环条件永远为真检查条件逻辑或增加break最后分享一点我的实际体会写shell脚本跟写其他语言一个很大的不同是语法细节特别多而且每个细节背后往往都有历史包袱。比如fi、done、esac、;;这些反直觉的写法不是设计者故意刁难人而是当年就是这么定下来的用着用着就习惯了。我个人的建议是不要一上来就背语法而是带着真实需求去写。想批量重命名文件就去查for循环怎么用想每天自动备份就去学判断和变量想监控系统状态就去读别人写的脚本范例。每解决一个实际需求语法就内化了一层。我自己就是靠着这个方式从只看懂echo到能写几百行的部署脚本前后也没花太长时间。这个系列的下一篇我打算讲讲shell脚本里更进阶的内容比如文本处理三剑客grep、sed、awk的配合使用以及定时任务里跑脚本的注意事项。先把这篇的基础语法吃透动手写几个小脚本后面再往前推进会轻松很多。

相关新闻

具身人工智能工程化实战:2026年产线落地的三大核心能力

具身人工智能工程化实战:2026年产线落地的三大核心能力

1. 具身人工智能到底是什么?先别急着查定义,我用三台“会动的脑子”给你讲明白具身人工智能——这个词最近在技术圈、产业会议甚至制造业一线车间里频繁出现,但很多人听到的第一反应是:“又一个新造词?”“是不是就是机…

2026/10/14 6:46:30 阅读更多 →
【MATLAB】基于元胞自动机的人员疏散模型参数优化仿真研究

【MATLAB】基于元胞自动机的人员疏散模型参数优化仿真研究

【MATLAB】基于元胞自动机的人员疏散模型参数优化仿真研究 摘要:公共场所人员密集、人流复杂,突发紧急情况下的人员疏散效率直接决定事故伤亡规模。传统经验公式与宏观疏散模型精度低、无法刻画个体避让、拥堵、绕行等微观行为。元胞自动机(CA)凭借离散网格、规则简单、并…

2026/10/14 6:46:30 阅读更多 →
Claude Code 工具调用返回空怎么办?claude-opus-5.5 的 input_schema 校验踩坑记录与修复方案

Claude Code 工具调用返回空怎么办?claude-opus-5.5 的 input_schema 校验踩坑记录与修复方案

上周三我在用 Claude Code 跑一个自动化重构任务,模型切到 claude-opus-5.5 之后,工具调用的结果突然全变成空的了。stop_reason 明明是 tool_use,content 数组里也有 type: tool_use 的块,但 input 字段要么是 {},要么…

2026/10/14 6:46:30 阅读更多 →

最新新闻

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →
电商数据获取技术解析与实战架构设计

电商数据获取技术解析与实战架构设计

1. 电商数据获取的核心价值与挑战在电商行业摸爬滚打这些年,我深刻体会到数据就是决策的氧气。记得2016年刚入行时,团队还在用Excel手动统计商品点击量,现在回头看简直像石器时代。如今一个中等规模的电商平台,日均产生的用户行为…

2026/10/14 7:20:37 阅读更多 →
豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

很多人学网络爬虫时,第一个练手项目都会选豆瓣电影排行榜的数据抓取。理由很简单:页面结构清晰、数据规律、难度适中。但如果你以为requests拿到HTML、正则抠出几条电影名就算学会了爬虫,那离真正的高级数据抓取还差着十万八千里。我见过不少…

2026/10/14 7:20:37 阅读更多 →
做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?这个问题几乎每个新入局的人都问过,但网上的答案特别极端:一边是晒后台截图说上架三天就出单的,一边是吐槽备货压了几万块却迟迟见不到钱的。我跟几个做全托管、半托管的朋友反复对过账,也盯着后…

2026/10/14 7:20:37 阅读更多 →
AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

1. 这个“2万Star”到底意味着什么:从GitHub数字看AI编程教程的真实分量很多人看到标题里“2万Star”第一反应是:哇,火了。但作为在开发者教育领域摸爬滚打十多年的老手,我得先泼一盆冷静的水——Star数从来不是教学内容质量的直接…

2026/10/14 7:19:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →