您现在的位置是:烟消火灭网 > 休闲

shell脚本

烟消火灭网2026-10-17 07:41:54【休闲】6人已围观

简介凌晨两点,服务器磁盘使用率飙到98%。我打开终端,敲下三行命令,一个shell脚本跑完,清掉了三天前的日志和临时文件。整个过程不到两秒。如果手动操作,至少十分钟,还容易删错东西。 shell脚本不是什

凌晨两点,服务器磁盘使用率飙到98%。我打开终端,敲下三行命令,一个shell脚本跑完,清掉了三天前的日志和临时文件。整个过程不到两秒。如果手动操作,至少十分钟,还容易删错东西。

shell脚本不是什么高深技术。它就是把你平时在命令行里一条条敲的命令,按顺序写进一个文本文件,然后让系统一次性执行。就这么简单。但恰恰因为简单,很多人低估了它的价值。

我见过一个运维同事,每天上班第一件事是手动检查二十台服务器的内存和磁盘。打开终端、ssh登录、敲df -h、free -m、复制粘贴到表格。一套流程四十分钟。后来我帮他写了个脚本,循环遍历IP列表,把结果汇总输出到一个文件。他第一次跑完那个脚本时愣了几秒,说:“就这?”对,就这。但那四十分钟他再也不用花了。

脚本的本质是自动化决策

光把命令堆在一起不算脚本,那叫批处理。真正的脚本要能根据情况做判断。比如备份文件,你得先检查目标目录存不存在,不存在就创建;磁盘空间不够就跳过并告警;备份成功了写日志,失败了发邮件。这些逻辑用if、case、&&、||就能串起来。

有个细节很多人忽略:set -e。加在脚本开头,任何一条命令返回非零状态码就立即退出。不加的话,中间某步失败了脚本还在傻跑,最后给你一个看似成功的结果。我踩过这个坑——数据库导出失败,但脚本继续执行,把空文件传到了备份服务器。三天后才发现。

变量和引号是新手翻车重灾区

写shell脚本,变量赋值等号两边不能有空格。NAME = "test"会报错,必须写成NAME="test"。这个规则看着奇怪,但shell就是这么设计的——空格是命令和参数的分隔符。

引号更微妙。$VAR不加引号,如果变量里有空格或通配符,shell会做单词拆分和路径展开。一个文件名叫my file.txt,你写rm $FILE,它会把my和file.txt当成两个文件。加双引号"$FILE"才安全。这条规则我用了好几年才养成肌肉记忆。

别用shell做它不擅长的事

有人拿shell写复杂的数据处理,几千行脚本维护起来像噩梦。shell擅长的是流程编排——调用其他程序、管理文件、控制执行顺序。字符串解析、浮点运算、复杂数据结构,交给Python或awk。我自己的判断标准:如果脚本超过两百行,或者需要嵌套三层以上的循环加条件判断,就该换语言了。

还有个实用习惯:脚本开头写清楚用途和用法。usage()函数配合getopts处理参数,别人拿到你的脚本知道怎么跑。我自己三个月前写的脚本,回头看都得先读一遍才想起来参数顺序。

调试技巧比语法更重要

bash -x script.sh会打印每条执行的命令和变量展开后的值。排查问题时比echo大法高效得多。另一个技巧是在脚本里临时加set -x和set +x,只对你怀疑的那段代码开启调试输出。

写脚本这些年,最大的体会是:不要追求一次写对。先写能跑的版本,再处理边界情况——文件不存在怎么办、权限不够怎么办、网络断了怎么办。每加一个判断,脚本就稳一分。那些凌晨两点能安心睡觉的夜晚,都是靠这些判断撑住的。

很赞哦!(85)