
这些年我带过不少刚接触Linux的同事自己也从“只会ls和cd”的阶段一步步走过来。回头再看Linux的学习曲线陡其实陡在指令太多、太碎今天记了明天忘真到用的时候又不知道用哪个。这篇就当作一份基础指令的学习总结把我自己梳理过的、实际工作中真正高频的命令整理出来。不说大而全只求把最核心的、面试和工作里大概率会碰到的内容讲透。内容面向Linux初学者、准备运维或开发岗位面试的读者也适合那些已经在用Linux但总觉得命令体系有点散的人。1. 基础指令学习思路先建框架再填细节1.1 我当初为什么频繁查命令而不是记命令刚开始接触Linux那阵子我的习惯是“用到哪查到哪”。比如要删目录百度一下rm -rf复制粘贴回车要看日志再查一下tail。这样确实能解决眼前的问题但问题是同一个命令我可能查了五六遍还是记不住因为每次都是机械复制没有真正理解“为什么是这个参数”“这个命令在什么场景下是最优解”。后来我换了个思路先搞清楚Linux命令的底层逻辑再按照使用场景把命令分类记忆。你会发现Linux命令设计是有规律可循的——大部分命令遵循“命令 参数 对象”的结构参数之间还能组合。比如ls -lh、ps -ef、grep -rn其实都是这个套路。我把基础指令分为六类文件与目录操作ls、cd、cp、mv、rm、mkdir、find等文本处理与查看cat、more、less、tail、head、grep、sed、awk等权限与用户管理chmod、chown、useradd、passwd、sudo等网络相关ping、curl、wget、netstat、ss、telnet、ssh等系统信息与进程管理ps、top、free、df、du、kill等压缩打包与软件安装tar、zip、yum、apt、rpm等这个分类法帮我解决了一个核心问题当我遇到一个新任务我第一反应不是“我要用什么命令”而是“这个任务属于哪个场景然后再从场景对应的命令组里挑工具”。1.2 命令学习的一个核心原则从场景出发不要从命令出发很多人学命令会走进一个死胡同今天背ls的10个参数明天背grep的15个参数结果背完就忘因为没有使用场景。我自己的体会是以“我能用这个命令解决什么问题”为出发点而不是“这个命令有哪些参数”。举个例子ls有-l、-a、-h、-t、-S等十几个参数但你日常真正高频使用的可能就两三个查看详细列表用ls -l看隐藏文件加ls -a让文件大小更易读用ls -lh。这三个组合基本覆盖了日常90%的目录查看需求。剩余的参数等你真的遇到了对应场景比如“我要按时间排序看哪个文件最新”这时再学ls -t反而记得很牢。所以我的建议是第一遍学基础指令时每个命令只记最常用的三个用法即可第二遍再结合工作场景逐步扩展。这个思路贯穿本文后边的命令详解也会围绕“高频场景”来展开。2. 文件与目录操作Linux操作的基石2.1 高频命令逐个过ls、cd、cp、mv、rm、mkdir文件与目录操作是Linux使用频率最高的一类命令也是新手最容易出问题的部分。先从最基础的几个说起但我会把“坑点”一并交代清楚。ls查看目录内容。日常我几乎只记三种写法ls平铺查看、ls -l详细列表能看到权限、属主、大小、时间、ls -a显示隐藏文件。三个参数可以组合成ls -la或ls -lha-h是让文件大小以K、M、G这样的单位展示而不是赤裸裸的字节数肉眼看起来舒服很多。还有一个很实用的组合ls -lt按修改时间从新到旧排序排查“哪个文件刚刚被动过”时特别好用。cd切换目录。这需要注意cd和cd ~都是回到当前用户的家目录cd -是回到上一次所在的目录这个在两边目录来回切换时效率极高cd ..是上一级目录。很多新手会混淆绝对路径和相对路径绝对路径是从根/开始写完整路径相对路径是从当前位置出发。久了你会发现工作中两者混着用没有谁一定更好关键是清楚自己当前在哪个目录——所以我会勤用pwd显示当前路径特别在脚本里写路径时pwd能避免很多“找不到文件”的迷惑现场。mkdir创建目录。高频参数是-p作用是可以递归创建多级目录。mkdir -p /tmp/a/b/c能一口气创建a、b、c三层目录如果没有-p父目录不存在时会直接报错。另一个实用参数是-v它会在创建目录时显示过程写脚本时方便留日志。cp复制文件或目录。复制单个文件就是cp 源文件 目标位置。复制目录必须加-r表示递归复制不然会报“omitting directory”。日常我更常用的是cp -a它是-r的加强版会保留文件原有的权限、属主和时间戳做配置备份时非常稳。还有一点cp -r复制软链接文件时默认会把链接指向的真实文件内容复制过去如果只想复制链接本身需要加-P或者-d。这个细节容易踩坑我放到后边问题章节细说。mv移动文件或重命名。mv本身就能实现重命名mv old.txt new.txt。它也可以在移动的同时改名mv /tmp/a.txt /home/user/b.txt。mv有个容易被忽略的行为当目标是一个已存在的文件时mv默认会直接覆盖不会给任何提示。所以我会在重要操作前先ls确认目标位置或者利用-i参数让系统在覆盖前询问。rm删除文件或目录。核心参数是-r递归删除目录和-f强制删除不提示。这里我要非常严肃地说rm -rf是危险系数最高的命令组合。我见过不止一个同事在服务器上把rm -rf /home/user/project/多敲了一个空格变成rm -rf /home/user/project /结果整个根目录被清空服务直接瘫痪。血的教训是用rm之前先pwd确认当前目录再ls确认目标文件名生产环境能不用rm就不用先用mv把文件挪到一个临时目录确认没问题后再清理这个习惯能救命。2.2 find、locate找文件到底用哪个find是Linux上最强大的查找命令也是新手最怕的命令之一因为它参数多、输出格式“原生”。但说穿了其实也就几个常用姿势find /path -name 文件名按名称精确或模糊查找文件名可以用通配符比如find /var/log -name *.log。这个场景最常见的坑是忘记加引号如果通配符不加引号Shell会先把*.log展开成当前目录下匹配的文件名再传给find结果就完全不对了。所以我的习惯是-name后边永远带引号。find /path -type f -size 100M按类型和大小筛选f代表普通文件d代表目录。排查磁盘占用时我常用find / -type f -size 500M -exec ls -lh {} \;先定位大文件再逐个确认。find还可以配合时间参数-mtime -77天内修改过、-mtime 3030天前修改过。日志清理场景中这是主力用法。locate则是基于数据库的查找工具速度远快于find但它依赖系统定期更新的索引库。如果你刚创建的文件立刻用locate去找大概率找不到因为索引还没更新。需要手动updatedb刷新。日常我以find为主locate只在明确要找的文件是旧文件时才会用。2.3 文件内容的查看与翻页cat、more、less、head、tail日志排查、配置确认都离不开这几个命令。先说结论大文件用less小文件用cat实时跟踪用tail -f。cat一次性输出整个文件内容。适合看小文件比如cat /etc/hosts。它最实用的参数是-n能显示行号对定位配置行很有帮助。但文件一超过几百行cat就不好用了因为内容瞬间刷屏你还是看不到前面的部分。more分页显示文件。只能向下翻页按空格翻下一页按b回翻。它功能简单现在已经逐渐被less取代。不过在一些精简系统里more是默认存在的所以还是值得知道。less比more更强大的分页工具可以上下翻页、搜索、跳转。看大日志我最常用的是它。打开文件后输入/关键词向下搜索、?关键词向上搜索按n跳到下一个匹配位置。退出按q。对于几百MB的日志less也不会一次性把文件全部读入内存性能很稳。我还会用less 行号 文件直接跳到指定行比如less 500 /var/log/syslog。head和tail查看文件的头部和尾部。head -n 20显示前20行tail -n 20显示最后20行。tail最经典的用法是tail -f实时滚动输出新增内容排查线上问题时打开一个tail -f日志窗口服务日志一边打一边滚定位报错非常直观。-f还可以配合--pid参数当指定进程退出时自动停止跟踪这个在脚本里很实用。3. 文本处理三剑客grep、sed、awk3.1 grep最常用的过滤工具掌握精准匹配grep的作用是在文本中搜索匹配的行。基础用法是grep 关键词 文件。但真正工作中离不开的是它和管道符|的组合ps -ef | grep java、cat app.log | grep ERROR这种“先输出再过滤”的模式是Shell操作的基本功。grep的几个高频参数-i忽略大小写排查日志时很常用因为程序日志里ERROR和error都可能出现。-v反向匹配输出不包含关键词的行比如过滤掉日志中的调试信息。-r递归搜索目录grep -r 待搜索词 /etc/会在/etc下所有文件中逐个搜索。-n显示匹配行所在的行号配合-r使用能直接定位到“哪个文件的第几行”。-c统计匹配行数而不是输出内容本身。-E启用扩展正则表达式比如grep -E ERROR|WARN app.log能同时匹配两种级别。在实际工作中grep配合正则是最强组合。比如查IP地址可以用grep -E [0-9]{1,3}(\.[0-9]{1,3}){3}查时间格式用grep -E ^2024-06-01。但这对新手来说跨度有点大建议先把-E和简单正则的几个元字符^开头、$结尾、.任意字符、*重复学会再逐步深入。3.2 sed流编辑器定位修改的利器sed的全称是stream editor流编辑器。它擅长处理“按照规则对文本进行编辑”的任务比如替换、删除、插入指定行。我日常最常用的只有一个核心功能替换。基本语法sed s/旧内容/新内容/g 文件。s表示替换操作g表示全局替换不加g则每行只替换第一处匹配。注意这个命令默认不会修改原文件只是把替换后的结果输出到屏幕。要真正修改文件需要加-i参数sed -i s/旧内容/新内容/g 文件。举一个实际场景配置文件里有一批IP需要从192.168.1.10改成192.168.1.11直接sed -i s/192.168.1.10/192.168.1.11/g /etc/app.conf一键搞定。另一个场景是删除指定行sed -i 5d file.txt删除第5行sed -i 1,10d file.txt删除1到10行。这个在没有可视化编辑器的服务器上非常实用。我特别提醒一点sed -i是个“不可逆操作”尤其是替换正则写错时可能把文件内容改得面目全非。我的习惯是先用不带-i的命令把替换结果打印到屏幕确认无误再执行带-i的真实修改。重要配置文件更稳妥的做法是提前cp一份备份。3.3 awk按列处理文本的高级工具如果说grep做的是行过滤sed做的是行编辑那awk做的则是按列处理。awk默认以空格或制表符作为列分隔符$1代表第一列$2代表第二列$0代表整行。最经典的用法是ps -ef | awk {print $2}这条命令会把ps -ef结果中的第二列PID进程号全部打印出来。再配合grep就能实现“找到某个进程的PID然后干掉它”的经典组合ps -ef | grep java | grep -v grep | awk {print $2} | xargs kill -9。这条命令我拆解一下第一次grep java找出所有含java的行第二次grep -v grep排除掉grep命令自身的进程否则你会把grep命令自己当成匹配结果awk {print $2}提取出PID列xargs kill -9把PID逐个传给kill命令。这个组合几乎是Linux运维的“条件反射”级技能面试也常考。awk还支持指定分隔符awk -F : {print $1} /etc/passwd按冒号分割并输出第一列也就是系统所有用户名列表。这一招在查看用户、处理CSV格式数据时非常实用。awk本身是一门完整的编程语言有变量、循环、条件判断但基础阶段掌握$1列输出和-F分隔符就足够应付大部分场景了。4. 权限、系统信息与网络配置保证“能干活”的底层能力4.1 用户与权限chmod、chown、useradd的小白级理解Linux多用户系统的核心机制是权限管理。每个文件都有三组权限——属主user、属组group、其他人other每组权限又包含读r4、写w2、执行x1三种。数字表示法是权限配置最常用的方式chmod 755 file表示属主有rwx权限4217属组有rx权限415其他人有rx权限5。我把数字权限换算逻辑记成r4w2x1三者相加即可。chmod的两个高频场景第一个是给脚本添加执行权限chmod x script.sh第二个是设置文件为755或644chmod 755 app.jar、chmod 644 config.properties。目录的权限含义和文件略有差别目录的r代表可以列出目录内容w代表可以在目录内创建删除文件x代表可以进入目录。所以一个只读目录通常用555一个共享目录常用775。chown用来修改文件属主和属组chown user:group file。常见场景是把部署的软件目录授权给运行用户chown -R tomcat:tomcat /usr/local/tomcat。-R表示递归修改目录下的所有文件。useradd创建用户配合passwd设置密码。Linux用useradd -m username能创建用户并同时创建家目录不加-m可能没有家目录。创建完用su - username切换到新用户。这里有个细节su -带连字符是“完全切换”会把当前环境变量也切换成目标用户的不带连字符的su username只是切换身份环境变量还是原来的经常会引发找不到命令之类的问题。4.2 系统信息查看ps、top、free、df、du的读法排查系统问题第一步是“看状态”这几个命令是状态查看的核心。ps查看进程快照。我常用ps -ef看所有进程的完整信息输出里UID是执行用户PID是进程号PPID是父进程号CMD是启动命令。ps aux输出类似但风格略不同两者都可以。面试常问“怎么查看某个进程是否在运行”答案就是ps -ef | grep 进程名。top动态查看系统资源占用类似Windows的任务管理器。一打开就能看到CPU使用率、内存使用率、负载均值以及占用资源最高的进程列表。按shiftp可以按CPU排序按shiftm可以按内存排序这个在排查“谁把CPU打满了”时非常关键。退出按q。free查看内存使用情况。free -h人性化显示第一行是物理内存总量、已用、可用第二行是交换分区swap。我要提醒一个常见误区free输出里的“available”才是真正可用的内存而不只是free列的数字因为Linux会把空闲内存用作缓存buff/cache这部分在内存紧张时是可以释放的。df查看磁盘分区使用情况。df -h按人类可读的格式显示每个挂载点的总容量、已用容量、可用容量和使用率。排查“磁盘满了”问题时第一反应就是它。du查看目录或文件占用的磁盘空间。du -sh /path可以汇总显示某个目录的总大小du -sh /path/*可以列出这个目录下每个子目录的大小。当df显示磁盘已满但你又不知道是哪个目录占的这时就从根目录逐层用du -sh *往下找很快能定位到大文件或大目录。4.3 网络排查ping、curl、telnet、netstat/ss的合理分工网络问题的排查有它自己的一套“组合拳”。先交代每个命令的定位再讲它们怎么搭配。ping测试网络连通性。ping -c 4指定发送4个ICMP包后自动停止不加-c会一直发。它是排查“网络通不通”第一步但只能证明IP层可以通证明不了端口是否能访问。telnet测试指定IP和端口是否开放。命令格式telnet ip port。比如telnet 192.168.1.10 8080如果端口通会显示连接成功如果失败会显示Connection refused或超时。很多系统默认不安装telnet客户端需要额外安装但它在网络排查里确实有不可替代的角色。这里要区分“telnet服务”和“telnet客户端”我们日常用的是客户端去测试别人的端口。curl发HTTP请求的工具也是我最常用的接口调试命令。curl -I http://example.com查看响应头curl -v http://example.com显示详细请求过程包含DNS解析、TCP连接、TLS握手、响应状态码排查看起来很直观。curl -X POST -H Content-Type: application/json -d {key:value} http://address/api可以发送POST请求测试接口。netstat和ss查看本机端口监听和连接状态。netstat -tlnp是所有监听端口的黄金组合-t只看TCP-l只看监听状态-n不解析域名和服务名-p显示占用端口的进程PID和名称。ss是netstat的替代者性能更好参数基本兼容ss -tlnp。排查“端口被谁占了”“服务有没有启动成功”这类问题这两个命令是标准答案。一个典型排查流程先ping看网络通不通再telnet ip 端口看目标端口通不通再ss -tlnp看本地端口有没有被监听最后curl验证应用层服务是否正常返回。这套流程每次都能帮我快速把问题定位在“网络层、端口层、应用层”的某一层。5. 高频组合操作与实战排错笔记5.1 三个高频组合操作建议直接抄走基础指令单个掌握之后真正高效的是组合起来用。我分享三个高频操作都是实战里反复用到的。组合一根据进程名定位并杀进程。命令是ps -ef | grep java | grep -v grep | awk {print $2} | xargs kill -9这个场景是服务启动异常需要强制结束旧进程。解释一下为什么需要grep -v grep当你在命令行里执行grep java时这个grep命令本身会出现在ps -ef的结果里它的命令行里包含“java”字样如果不把它过滤掉awk会把两个PID交给kill多杀一个无辜的grep进程。虽然影响不大但属于典型的不严谨操作。组合二实时查看日志并过滤关键词。命令是tail -f app.log | grep ERRORtail -f实时输出日志grep只保留包含ERROR的行。这样不用担心日志刷屏只关心报错信息。如果想在报错的同时看到上下文可以加grep -A 5 -B 5 ERROR打印匹配行前后各5行。组合三批量备份配置文件。命令是cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak_$(date %Y%m%d)这里$(date %Y%m%d)会执行date命令生成类似20250115的时间戳。这样每次修改配置前自动生成一个带日期的备份出问题了可以随时回滚。我在服务器上改任何重要配置之前都会跑一条类似的备份命令这几乎成了肌肉记忆。5.2 常见问题与排查技巧实录我把自己在学习和实战中见过的典型问题整理成速查表方便对照排查。现象可能原因排查命令/思路提示command not found命令不在PATH路径中echo $PATH检查路径确认命令是否安装或使用绝对路径执行删除目录时报cannot remove目录非空或没有写权限ls -ld 目录看权限chmod修改权限后再删修改了文件内容但服务没生效可能需要重启进程或reload配置先确认服务还在用旧配置文件nginx -s reload等操作让配置生效磁盘满了但df -h显示实际文件不大删除的文件被进程占用空间未释放lsof | grep deleted找到占用已删除文件的进程重启该进程grep搜不到内容但人能肉眼看到字符编码问题或正则没写对先用grep -a把文件按文本方式处理再检查关键词是否含特殊字符脚本权限够了仍无法执行脚本第一行缺少shebang或格式是DOS换行head -1 脚本确认有#!/bin/bash用sed -i s/\r$// 脚本去掉Windows换行符tar解压后覆盖了现有文件tar默认会覆盖同名文件解压前先tar -tf预览包内文件列表重要目录先备份用find找文件时目录权限不足报错find尝试进入无权限目录加上2/dev/null忽略错误输出或者用sudo find提权这几个问题里我特别想多说一个删除文件后磁盘空间不释放这个在排查时最容易绕圈子。原因在于Linux里一个文件被删除后只要有进程还在持有它的文件句柄磁盘空间就不会释放。df -h显示的依然是高占用但你在文件系统里已经找不到这个文件了。此时用lsof | grep deleted列出所有“已删除但仍被占用”的文件找到对应进程后重启或kill空间才会真正释放。有一回我在一台测试服务器上排查磁盘删了一个几个G的日志文件df却纹丝不动当时愣了半天后来才想起这个原理。5.3 要不要背命令我的命令记忆方法论很多读者会问“这些命令到底要不要背有没有什么技巧”我的答案是不要死记硬背但要把最核心的几十条练成“条件反射”。具体方法是第一每个命令只记它的“最小可用集”。ls记住-lhagrep记住-rn和-vfind记住-name -type -sizeawk记住{print $n}和-Fsed记住s/旧/新/g和-i。这些最小可用集能解决日常工作里80%的问题剩下的20%用时再查。第二善用man和--help。man命令打开官方手册命令 --help快速查看参数说明。看不懂英文没关系只看-x、--xxx这种参数名称和简短说明基本能猜出用途。我直到现在写复杂的find、tar命令时都会先跑一遍--help确认参数格式。第三把命令串成“故事”来记。比如文本处理这条线cat看内容 -grep过滤行 -awk提取列 -sed修改替换 -或保存结果。这一串下来就是一个完整的“处理日志数据”的流程。比起孤立记五个命令串联成一个流程更有利于长期记忆。6. 实操过程从零搭建一套自己的命令工作流6.1 实操一新服务器上手检查必做的六个指令每拿到一台新的Linux服务器我都会按固定顺序做一轮状态检查这些指令组合起来就是一套基础体检流程。第一步确认系统版本和内核cat /etc/os-release uname -a第二步查看CPU和内存nproc free -hnproc直接输出CPU核心数比看/proc/cpuinfo快很多。free -h确认内存总量和可用量。第三步查看磁盘分区和使用率df -h lsblklsblk能以树状结构显示磁盘和分区的关系比fdisk -l看起来更直观。第四步检查系统时间和时区date timedatectl服务器时间漂移会影响日志定位和定时任务执行时区不对则会直接影响业务展示的时间。很多新手配置完服务器后从不看时间直到日志时间对不上才发现问题。第五步查看网络和主机名ip addr hostnamectl第六步查看系统负载和当前登录用户uptime who这套检查流程大概两分钟新服务器有没有配置异常基本能摸个底。我建议刚学Linux的读者拿到一台新虚拟机后都按这个顺序操作一遍每执行一条命令就想一想“这条命令看的是系统的哪个维度”比单纯看教程记得牢。6.2 实操二日志文件太大如何安全地处理日志日志清理是Linux日常维护里最常遇到的任务之一。日志文件动辄几个G直接rm虽然简单但会面临两个问题一是删除后磁盘空间可能不释放前文说过的文件句柄占用问题二是如果里面有近期排障需要的信息删掉就再也找不回来了。我先演示一种稳妥做法截断日志而不是删除日志。 /var/log/app.log这个命令把日志文件的内容清空但文件本身还在正在写日志的进程不会受到任何影响因为文件句柄没有变化。这是“让日志文件归零”的标准操作。如果需要保留近期的日志可以先把旧日志归档再重置cp /var/log/app.log /var/log/app.log.$(date %Y%m%d) /var/log/app.log这样旧日志带时间戳保留新日志继续往原文件写。归档文件累积多了以后再按时间清理。我习惯保留最近30天的归档日志更早的定期find /var/log -name *.log.* -mtime 30 -delete一键删除。-delete是find的参数直接删除符合条件的文件比-exec rm {} \;更简洁但要注意它支持的条件要写准确不然误删就麻烦了。还有个高频需求只保留日志文件最后N行其余丢弃。tail -n 1000 /var/log/app.log /tmp/app.log.tail mv /tmp/app.log.tail /var/log/app.log。先用tail截取最后1000行到临时文件再移回去覆盖。这个操作对大日志文件很实用但做之前务必确认最后1000行是你需要保留的内容。6.3 实操三配置文件修改的标准作业流程修改服务器上的配置文件我有一套自己的固定流程这套流程帮我在生产环境踩坑率降到了很低。第一步备份。cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date %Y%m%d%H%M)第二步查看原始内容确认要改哪些行。cat -n /etc/nginx/nginx.conf-n显示行号方便后续用sed按行号定位。第三步修改前先用sed预览。sed -n 20,30p /etc/nginx/nginx.confsed -n 20,30p打印20到30行确认要修改的位置没错。这个预览步骤看着多余但能避免“改错行”这种最尴尬的失误。第四步执行修改。sed -i s/worker_processes 1;/worker_processes 4;/ /etc/nginx/nginx.conf第五步验证语法。nginx -t配置类服务基本都有类似的语法检查命令比如nginx -t、sshd -t。修改完必须跑一遍语法检查再reload服务。第六步reload服务让配置生效。nginx -s reload注意是reload不是restart。reload是平滑加载新配置不会断开现有连接restart是重启进程会短暂中断服务。生产环境能reload就不restart这是运维的一个基本原则。7. 我踩过的坑写给新手的几句实在话最后这部分我想分享几个自己刚接触Linux时踩过的坑你可能也会遇到。第一个坑在Windows习惯的驱使下用CtrlC复制、CtrlV粘贴。Linux终端里CtrlC是发送中断信号SIGINT给当前正在运行的前台进程如果你正在执行ping命令按CtrlC会直接把ping中断。终端里复制粘贴的正确方式是CtrlShiftC和CtrlShiftV或者直接用鼠标选中就是复制、点鼠标中键就是粘贴。第二个坑以为rm -rf是最快的清理方式结果误删了项目目录。我的改变是先在/tmp下建一个类似“回收站”的目录mkdir -p /tmp/trash需要清理时先mv过去确认几天没问题再清空rm -rf /tmp/trash/*。这套“软删除”逻辑虽然多了一步但在关键时刻能救命。第三个坑修改文件后不验证就直接重启服务。我早期改过/etc/fstab写错挂载参数重启服务器后直接进不了系统。打那以后凡是要重启才能生效的系统级配置比如/etc/fstab、/etc/selinux/config、/etc/profile我都会用“先备份、再修改、后验证”的流程绝不在改完配置后直接心存侥幸地重启。第四个坑脚本在Windows上写完传上去一执行就报/bin/bash^M: bad interpreter。原因是Windows的换行符是\r\nLinux是\n多出来的\r被当成命令的一部分了。解决办法是sed -i s/\r$// script.sh去掉\r。现在写脚本我干脆直接用vim在Linux上写省得来回折腾。Linux的学习曲线确实存在但基础指令这个阶段只要肯花时间反复敲很快就能跨过去。我的建议很简单不要求全先从ls、cd、cp、mv、rm这五个最基础的命令开始配合一个实际场景比如搭建一个简单的Web服务围绕这个场景去学习和使用命令。当你发现能用自己的方式解决一个实际部署或排障问题的时候Linux的大门就算真正踏进来了。剩下的命令都是在一次次“有问题再查、查完再实践”的过程中慢慢积累起来的。