获课地址:xingkeit.top/7625/
2016年,我第一次点开尚硅谷的Linux教程。
那时我刚入行,对运维的理解就是“会敲ls就算会Linux”。公司服务器是CentOS 6.5,我连vim都不会退出,每次卡住就关终端重连。旁边的老运维看我一眼,没说话,把他的.bashrc发给我,里面 alias 了一行:alias q='exit'。
他说:“你以后会谢我的。”
后来我谢了他很多次。
但真正让我从“会敲命令”变成“会写脚本”的,不是那行alias,是尚硅谷那套Linux教程里,讲Shell编程的那几章。
第一层:命令是人机对话,脚本是自动驾驶。
很多人学Shell,卡在第一步:命令敲得挺溜,一写脚本就懵。
不是语法不会,是思维没转过来。
尚硅谷第78节,标题叫“命令是问路,脚本是记路”。
讲师打开终端,敲了一行ls,然后说:
“你现在是在跟计算机对话。你问它‘目录里有啥’,它答。你问一句,它答一句。”
“脚本不是这样。脚本是你出差前画一张地图,你人不在,计算机按地图走。”
他演示了一个最简单的场景:每天凌晨打包日志,按日期命名,删除七天前的旧包。
你手动做这件事,要敲五条命令。你写脚本做这件事,还是那五条命令,只是包在一个文件里,交给cron。
“你不需要学新命令,”他说,“你只需要学会把命令排好队。”
那一刻我突然明白,Shell编程不是新知识,是旧知识的组合。
第二层:变量不是存数据,是别写死。
很多新手写脚本,第一版全是硬编码。
备份日志,路径写死/home/app/logs。压缩文件名写死backup.tar.gz。删除保留天数写死7。
脚本跑通了,很开心。三天后日志路径改了,打开脚本一行行改。五天后压缩格式要换.zip,又一行行改。七天后面试官问“你写过脚本吗”,答写过,但不敢说写过什么。
尚硅谷第82节,讲师用十分钟讲了三个变量。
LOG_DIR=/home/app/logs
BACKUP_NAME=backup_$(date +%Y%m%d).tar.gz
RETENTION_DAYS=7
“这三行放在脚本开头,以后你只需要改这里。”
他顿了顿:
“写脚本不是写一次跑永久。写脚本是写一次,以后只改三行。”
第三层:条件判断不是if语法,是容错思维。
新手写脚本,默认一切顺利。
目录一定存在,文件一定可读,磁盘一定有空。脚本跑完,一切正常。脚本崩了,输出一片红,不知道哪行出问题。
尚硅谷第85节,标题叫“脚本里有一半代码是处理意外的”。
他演示一个备份脚本,第一版十行,第二版二十五行。
多出来的十五行在干什么?
——检查源目录是否存在,不存在就创建。
——检查压缩命令是否安装,没装就提示并退出。
——检查备份文件是否成功生成,没生成就发告警。
——检查磁盘剩余空间,小于阈值就跳过旧包删除。
“你不是在写脚本,”他说,“你是在给三个月后被凌晨电话吵醒的自己铺后路。”
那节课之后,我写脚本养成一个习惯:每写一行功能代码,跟一行防御代码。
后来线上跑崩过几次,没有一次是因为没写if。
第四层:循环不是重复劳动,是批量思维。
很多运维刚接触循环,觉得“不就是把一条命令重复执行N遍”。
尚硅谷第91节,讲师没讲for、while、until的语法区别。
他放了一个场景:
你有100台服务器,需要每台创建一个用户,设置密码,添加sudo权限,部署公钥。
手动做?一台五分钟,一百台五百分钟,一整天。
循环做?写一个for i in {1..100},把命令包进去,五秒钟写完,十分钟跑完。
“循环不是帮你省敲键盘的时间,”他说,“循环是让你从体力劳动者,变成脑力劳动者。”
那节课我反复看了三遍。
不是因为没听懂,是想记住那个“五秒钟写完”的瞬间。
第五层:函数不是封装代码,是封装思路。
初学者写脚本,写着写着就变成面条代码。
两百行,从上读到下,没有段落,没有分界。改一个功能,牵一发而动全身。加一个功能,不知道插在哪。
尚硅谷第95节,讲师把前面的备份脚本重构了一遍。
原来二十五行,拆成五个函数:
check_env()、backup_logs()、compress_files()、clean_old()、send_alert()。
主函数只有十行,像在朗读目录:
check_env
backup_logs
compress_files
clean_old
send_alert
“你现在读这个脚本,”他说,“不用看具体实现,已经知道它在干什么。”
那是我第一次理解“自解释代码”是什么意思。
不是注释写得多,是结构像一本书的目录。
第六层:正则不是背符号,是画边界。
Shell编程绕不开正则,正则劝退一半人。
^ $ . * [] [^] \ {n,m} — 这些符号初学者背了忘,忘了背。
尚硅谷第103节,标题叫“正则是在画框,不是在猜谜”。
讲师打开一个文本文件,里面是混杂的手机号、身份证号、邮箱、URL。
他问:你怎么把手机号找出来?
台下沉默。
“手机号有什么特征?11位,全是数字,不是1开头就是1开头——哦不对,就是1开头。”
他在白板上写:^1[0-9]{10}$
“这不是符号,这是手机号的画像。”
然后他演示grep、sed、awk,用这三板斧处理文本。
不是背参数,是描述特征:以什么开头,以什么结尾,中间什么长度,允许出现什么字符。
那节课之后,我再没背过正则符号。
我只记特征,符号是查的。
第七层:调试不是print大法,是系统方法。
每个Shell新手都有自己的调试土法。
有人狂加echo,输出各种“到这里了”“值是多少”。有人把-x参数当救命稻草,打开后满屏加号,更看不懂。还有人干脆注释掉半份代码,跑通了再一点点放出来。
尚硅谷第108节,标题叫“脚本报错,第一步做什么”。
不是看报错信息,不是搜搜索引擎。
是看退出码。
echo $? — 这条命令被严重低估了。
0是成功,非0是失败。不同的失败有不同的码,1是通用错误,2是用法错误,127是命令未找到,139是段错误。
“报错信息是人写的,可能写错。退出码是系统给的,不会骗你。”
他还讲了两个至今我都在用的调试习惯:
——脚本开头加set -e,遇到报错就停,防止雪崩。
——临时调试用set -x,查完立刻set +x关掉,别污染日志。
“调试不是天赋,”他说,“是方法。”
第八层:脚本不是终点,自动化是。
尚硅谷这套Linux教程,Shell编程部分最后一节,标题只有五个字:
“写完,然后呢?”
你写了一个备份脚本,手工执行,成功了。
然后呢?
——放进crontab,让它每天自己跑。
——输出日志重定向到固定文件,出事了能翻。
——关键步骤加锁,防止上次没跑完下次又启动。
——结果通知,跑成功发个OK,跑失败发个报警。
“写脚本只是完成了20%,”他说,“让脚本自己跑起来,不出事,出事能知道,知道能恢复——这才是剩下的80%。”
那节课的最后,他演示了一个完整的、带日志、带锁、带报警的自动化备份任务。
十五分钟。
我那时候不知道,十五分钟演示的内容,够我在生产环境摸索两年。
后来有人问我:尚硅谷那套Linux课都十年了,现在还看吗?
我说,命令会更新,发行版会迭代,systemd取代了init,NetworkManager取代了ifcfg。
但Shell编程那套东西——变量别写死、目录要检查、循环批量干、函数拆逻辑——十年了,一字不改。
不是因为没更新,是没什么需要更新的。
那是基本功。
课程简介里有一句话,十年没改过:
“我们不承诺让你成为运维专家,只承诺让你亲手写完第一个自动化脚本。”
2025年,我带了一个新人。
他问我要Linux学习资料,我把硬盘里那套旧教程翻出来,拉到第78节。
“从这开始看,”我说,“看完第八节,你就能写第一个脚本。”
他半信半疑。
两周后,他发来一段消息:
“哥,我写的日志清理脚本上线了。”
“用的变量、判断、循环、函数那一套。”
我回了一个字:
“好。”
没告诉他的是,十年前,我也是从这一节开始的。
本站不存储任何实质资源,该帖为网盘用户发布的网盘链接介绍帖,本文内所有链接指向的云盘网盘资源,其版权归版权方所有!其实际管理权为帖子发布者所有,本站无法操作相关资源。如您认为本站任何介绍帖侵犯了您的合法版权,请发送邮件
[email protected] 进行投诉,我们将在确认本文链接指向的资源存在侵权后,立即删除相关介绍帖子!
暂无评论