为什么要学shell脚本?
第一个脚本到底怎么写?
变量使用有哪些坑?
流程控制怎么玩出花样?
文本处理有哪些杀手锏?
如何调试脚本更高效?
脚本加密怎么实现?
Q:现在有Python/Java这些高级语言,学shell还有必要吗?
这得看场景!shell脚本在系统管理和自动化运维领域仍是霸主。比如批量改文件名、定时清理日志这些操作,用shell只需3行代码,其他语言可能要写20行。
效率对比表:
操作场景 | shell代码行数 | Python代码行数 |
---|---|---|
批量重命名文件 | 3 | 15 |
日志定时清理 | 5 | 25 |
进程状态监控 | 7 | 30 |
第一个脚本到底怎么写?
Q:在Windows系统能运行.sh文件吗?
装个Git Bash或者WSL就能玩转!跟着四步创建你的处女作:
- 新建文件
demo.sh
- 写入内容:
bash复制
#!/bin/bash echo "你好,$(whoami)!现在是$(date)"
- 赋予执行权限:
chmod +x demo.sh
- 运行:
./demo.sh
输出效果:
你好,ubuntu!现在是2024年2月20日 14:30:00
变量使用有哪些坑?
Q:为什么我的变量赋值总报错?
注意shell的空格敏感特性!正确写法是name="张三"
,等号两边不能有空格。常见错误类型:
错误代码 | 错误原因 | 正确写法 |
---|---|---|
name = "张三" | 等号带空格 | name="张三" |
$10 | 两位数参数需括弧 | ${10} |
echo nameage | 变量粘连 | echo name{age} |
流程控制怎么玩出花样?
Q:如何实现智能错误处理?
试试这个带异常检测的模板:
bash复制if ! ping -c1 google.com &>/dev/null then echo "网络连接失败" >> error.log exit 1 else echo "网络正常" > success.log fi
亮点功能:
&>/dev/null
静默执行命令exit 1
非正常退出状态码- 双日志分流记录
文本处理有哪些杀手锏?
Q:怎么快速提取日志关键信息?
awk和sed组合拳堪称无敌:
bash复制cat access.log | awk '$9==404 {print $7}' | sort | uniq -c | head -10
代码解析:
- 过滤HTTP状态码404的请求
- 提取请求路径
- 统计重复项并取前十
典型输出:
markdown复制23 /wp-admin.php 15 /old/login.jsp 8 /.env
如何调试脚本更高效?
Q:为什么我的脚本不报错但结果不对?
开启调试模式能看见隐藏细节:
bash复制#!/bin/bash -x for file in *.txt do mv "$file" "${file%.txt}.bak" done
调试输出示例:
markdown复制+ for file in '*.txt' + mv report.txt report.bak
脚本加密怎么实现?
Q:如何保护商业脚本源码?
用shc工具生成二进制文件:
bash复制shc -f script.sh ./script.sh.x # 运行加密后的文件
注意事项:
- 加密后的文件仍可逆向
- 不同CPU架构需要重新编译
- 有效期最长设置365天
现在你已掌握shell脚本的七种武器。个人建议从系统监控脚本开始实战,比如写个自动检测CPU负载超过80%就报警的脚本。记住,每天写10行脚本比看100页教程更有用!遇到报错别急着复制答案,先试试man bash
查手册,这才是工程师的终极秘籍。