文章目录
🔥 为什么你的Shell脚本总是跑不起来?(新手必看血泪史)
刚接触Shell脚本那会儿,我连最简单的#!/bin/bash
都能写错成#/bin/bash
(少了个感叹号啊朋友们!!!),结果脚本死活不执行。后来才发现,原来这行被称为"shebang"的声明语句,是脚本的命门所在(超级重要)!
🚀 新手必刷10大基础案例
- 文件批量重命名(拯救强迫症患者)
# 把所有的.jpg改成.png(注意测试后再操作!)
for file in *.jpg; do
mv "$file" "${file%.jpg}.png"
done
(敲黑板)${变量%模式}
这个语法是删除变量末尾匹配模式的部分,简直是字符串处理的神器!
- 自动清理7天前的日志(运维必备技能)
find /var/log -name "*.log" -mtime +7 -exec rm {} \;
这里有个大坑:-exec
后面的分号必须转义!!!我第一次写的时候漏了反斜杠,结果把整个目录都删了…(别问我是怎么知道的)
💡 中阶玩家晋级秘籍(20个实战技巧)
案例31:端口占用自动检测(网络排查神器)
#!/bin/bash
check_port() {
netstat -tuln | grep ":$1 " >/dev/null
return $?
}
if check_port 8080; then
echo "端口8080已被占用!(赶紧kill进程吧)"
else
echo "端口畅通无阻~"
fi
这个脚本教会我们:
- 函数返回值才是王道
>/dev/null
让输出静默- 退出状态码的巧妙运用
案例45:自动打包备份(防止删库跑路)
backup_dir="/data/backup/$(date +%Y%m%d)"
mkdir -p $backup_dir
tar -czf "${backup_dir}/www_$(date +%H%M).tar.gz" /var/www 2>> backup_error.log
(血泪经验)一定要加2>>
来捕获错误输出,否则打包失败你都不知道怎么回事!
🛠️ 高手都在用的黑科技(10个高级操作)
案例89:SSH自动登录集群(运维偷懒神器)
#!/bin/bash
pass="YourPasswordHere" # 当然实际要用ssh-key更安全!
for ip in 192.168.1.{100..120}
do
sshpass -p "$pass" ssh -o StrictHostKeyChecking=no user@$ip <<'EOF'
hostname
free -h
exit
EOF
done
(危险操作警告)虽然方便,但明文存储密码是大忌!建议改用ssh密钥认证,这里只是演示用法~
案例95:自动生成随机密码(安全工程师必备)
gen_pass() {
tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c 16
echo
}
这个神脚本用了:
/dev/urandom
真随机数生成器tr
命令过滤字符head
控制长度
(实测比在线生成器快10倍不止!)
🚨 避坑指南(来自踩过所有雷的过来人)
- 变量引用的坑:忘记加引号处理带空格的路径,就像
rm -rf $dir/*
遇上dir="hello world"
,直接炸裂! - 权限陷阱:明明写了可执行权限
chmod +x
,却忘了给脚本里的文件操作权限 - 编码问题:在Windows编辑的脚本放到Linux跑,换行符不对报错
^M
,记得用dos2unix
转换 - 路径依赖:绝对路径和相对路径混用,导致换个目录就报错(建议都用绝对路径!)
🌟 终极建议(价值十万的经验之谈)
看到这里的都是真爱!最后送你三个锦囊:
- 一定要加
set -euo pipefail
,让脚本遇错就停(保命符啊!) - 多用
shellcheck
工具做静态检查(比你自己找错快100倍) - 复杂的文本处理请直接上awk/sed,别死磕bash语法(省下时间喝咖啡不香吗?)
(文末彩蛋)需要完整100案例代码包的,评论区留言"我要上车"!不过说真的,最好的学习方式是把这些案例自己重写一遍,调通的过程比看100遍都有用!