早上急着出门,你习惯用一个shell脚本来自动备份手机照片、整理下载文件夹,再同步到网盘。可最近这脚本越跑越慢,等它跑完,咖啡都凉了。其实,shell脚本变慢不是无解难题,找准原因,对症下药,分分钟让它重新利索起来。
先看看是不是在反复读同一个文件
很多人写脚本喜欢把配置或数据文件读好多遍。比如每次循环都去读一次 config.txt,其实完全没必要。改成一次性读取,存成变量,效率立马提升。
# 慢的写法
for file in *.log; do
server=$(grep "server" config.txt)
echo "Sending $file to $server"
done
# 快的写法
server=$(grep "server" config.txt)
for file in *.log; do
echo "Sending $file to $server"
done
避免在循环里调用外部命令
像 find、grep、awk 这些命令功能强,但每次调用都有开销。如果在循环里频繁使用,积少成多就会卡顿。能合并就合并,能用内置功能就别外求。
# 慢的写法
for file in *.txt; do
if grep -q "error" "$file"; then
echo "$file has error"
fi
done
# 快的写法
grep -l "error" *.txt | while read file; do
echo "$file has error"
done
别让脚本在后台默默“吃资源”
有时候脚本慢,不是代码问题,而是系统资源被占光了。比如同时跑多个备份任务,或者有其他程序在疯狂读写磁盘。用 top 或 htop 看一眼,说不定发现某个日志进程正把硬盘跑满。
善用并行处理,别一条道走到黑
有些任务彼此不依赖,比如压缩多个独立文件夹。与其一个个来,不如一起干。用 & 和 wait 可以轻松实现并行。
for dir in project*; do
( cd "$dir" && zip -r "../$dir.zip" . ) &
done
wait # 等所有后台任务结束
换工具不一定非得守着 bash
如果脚本已经复杂到几百行,还在用纯 shell 处理字符串、解析 JSON,那当然慢。这时候不妨用 Python 或 awk 写核心逻辑,shell 只负责调度。各司其职,效率更高。
临时文件别乱堆,清理也耗时间
脚本生成一堆临时文件,每次运行前还要删一遍旧的,反而拖慢启动速度。用管道传递数据,减少中间文件,既省空间又省时间。
# 慢的写法
echo "processing..."
cut -f1 data.csv > temp1
grep active temp1 > temp2
sort temp2 > result.txt
rm temp1 temp2
# 快的写法
cut -f1 data.csv | grep active | sort > result.txt
脚本就像家里的收纳系统,一开始随手一放没问题,东西多了就得讲究方法。优化脚本,就跟整理抽屉一样,分类清楚、减少翻找、动作简洁,自然就快了。