优化 Shell 脚本的运行效率,核心思路是减少外部命令调用、减少子进程、减少磁盘 I/O、合理使用内置功能。下面按“常见瓶颈 → 优化方法 → 示例”来说明。
count=0
for i in $(cat file.txt); do
count=$((count + 1))
done
count=0
while read -r line; do
((count++))
done < file.txt
原因:
cat 会启动进程for + 命令替换会一次性读入内存while read 是内置行为,更高效sed/awk/cut❌
name=$(echo "$str" | cut -d: -f1)
✅
name=${str%%:*}
(( )) 而不是 expr❌
a=$(expr $a + 1)
✅
((a++))
result=$(grep "abc" file.txt | wc -l)
result=$(grep -c "abc" file.txt)
cat file | grep abc
✅
grep abc file
❌
echo "a" >> file
echo "b" >> file
echo "c" >> file
✅
{
echo "a"
echo "b"
echo "c"
} >> file
❌
if grep -q "abc" file; then
line=$(grep "abc" file)
fi
✅
if line=$(grep "abc" file); then
echo "$line"
fi
| 场景 | 推荐 |
|---|---|
| 大文本处理 | awk |
| 复杂逻辑 | Python / Perl |
| 大量循环 | 避免 Shell |
| 并发任务 | xargs -P / GNU parallel |
cat urls.txt | xargs -P 8 -I {} curl -s {}
或
parallel curl -s {} :::: urls.txt
forkfor i in *; do
(cd "$i" && do_something)
done
for i in *; do
cd "$i" || continue
do_something
cd ..
done
[[ ]] 而不是 [ ][[ "$a" == "b" ]]
set +x # 调试时再开
local 减少全局变量func() {
local i
for i in "$@"; do ...
}
| 写法 | 速度 |
|---|---|
for i in $(seq 1 10000) |
慢 |
for ((i=1;i<=10000;i++)) |
快 |
| `grep | wc -l` |
grep -c |
快 |
time bash script.sh
bash -x script.sh
能用内置就不用外部命令,能一次做就别循环做,能并行就别串行。
如果你愿意,可以把你的脚本贴出来,我可以逐行帮你优化。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。