
Linux学习总结(77)—— Shell 开发运维经验总结
1. 使用
2. 使用
3. 使用
6. 使用
7. 使用
8. 使用
10.
发布日期:2025-04-08 23:17:31
浏览次数:10
分类:精选文章
本文共 2632 字,大约阅读时间需要 8 分钟。
Shell脚本开发经验总结
前言
在系统运维与应用运维领域,自动化运维的进程从“纯手工”到“脚本化”再到“自动化”与“智能化”是一个逐步深化的过程。其中,Shell脚本作为自动化运维的重要工具,在运维工作中发挥着不可替代的作用。本文将分享在Shell脚本开发过程中积累的经验与教训,供运维工作者和脚本开发人员参考。
一、编写规范
1. 脚本开头部分
脚本的开头应包含以下要素:
- 功能说明
- 参数使用说明
- 作者姓名
- 创建/修改日期
- 版本信息
格式示例:
#!/bin/bash# 脚本名称: 服务器备份脚本# 参数说明: $1表示源服务器IP地址,$2表示备份服务器IP地址# 作者: 张三# 创建日期: 2023-10-01# 版本: v1.0
2. 代码格式与对齐
- 代码对齐有助于提高可读性,建议将循环、判断等语句保持一致。
- 使用
case
命令时,确保选项完全匹配。
示例:
case "选项" in "选项1") 指令 ;; "选项2") 指令 ;; *) echo "错误选项" ;;
3. 变量定义与验证
在脚本执行前,需验证所有未定义变量或命令返回值是否为非零,避免脚本运行异常。
示例:
set -eo pipefail
4. 环境变量与文件操作
- 对于敏感操作(如
rm
、mv
等),建议使用mv
替代rm
并转入垃圾箱。 - 使用
rm
时,建议使用find
结合delete
选项,避免误删。
示例:
find /path/to/dir -delete
5. 参数匹配与通配符
- 使用
*
和?
时,应根据最精确匹配原则,避免使用*
过度匹配。 - 不推荐使用
*
,如:rm /path/to/*.*
- 禁止使用
*
或?
,如:ls /path/to/??????????*
6. 数值型变量处理
- 变量赋值后,需确保值为数值型,避免后续处理异常。
示例:
value=10is_number=$value
7. 判断条件变量引用
- 变量在判断条件中需用双引号包裹,避免解析问题。
示例:
if [[ "$var" == "条件" ]]; then
8. 文件打包与压缩
- 打包时使用相对路径,避免全路径打包。
- 对于需要压缩的文件,建议使用管道处理,避免分开执行。
示例:
tar -cf - /path/to/file | gzip > file.gz
9. 进程管理
- 使用
ps
筛选进程时,若已知进程所属用户,应在参数中指定。
示例:
ps -ef | grep -w user | grep -v grep
二、常见坑
1. 使用>
替代cp
>
修改文件时,保留原文件的属组和权限,避免cp
操作带来的权限问题。
示例:
cat file > newfile
2. 使用kill
前确认
- 使用
-w
精确匹配进程,避免误杀。 - 使用
ps
输出结果时,需保留现场信息,避免多杀或误杀。
示例:
ps -ef | grep -w进程名 | grep -v grep > /tmp/kill_进程名_.backup
3. 使用rm
前确认
- 删除前备份文件或目录信息,避免误删。
- 避免使用
find
遍历根目录,直接使用文件名删除。
示例:
find /path/to/dir -delete
4. For循环陷阱
- 循环中的
in
条件需按空格分隔,避免进入死循环。
示例:
for i in "a b c" do
5. While循环禁忌
- 不要在
while
循环中使用管道,避免变量无法正确获取。
示例:
while read -r line; do
6. 使用cp
的空格问题
- 使用双引号包裹文件名,避免空格分词问题。
示例:
cp "文件名 - 开头" /path/to/dir
7. 使用cd
易错问题
cd
可能导致执行命令路径错误,需检查返回值。- 使用子shell避免
cd
影响父shell。
示例:
( cd /path/to/dir && ls )
8. 使用[
代替[
错误
- 当变量为空或含空格时,
[
无法正确处理,应使用[[ ]]
。
示例:
[[ "$var" = "值" ]]
9. 管道操作风险
- 不能在同一管道中同时读写文件,避免文件被截断或占用大量空间。
示例:
cat file | tee stdout stderr
10. cd
路径错误
cd
返回值不为零时,需使用||
执行后续命令。
示例:
cd /path/to/dir || echo "路径错误"
三、规避风险
1. 支持交互式脚本
- 使用
expect
或curl
实现简单交互。 - 示例:FTP文件上传。
curl -u user:pass --ftp-create-dirs --upload-file file /path/to/server
2. 脚本执行与日志追溯
- 提示用户使用说明,记录日志供跟踪。
- 示例:脚本执行日志记录。
#!/bin/bashecho "脚本执行说明:$0 $1 $2 ..."exec 2>&1 > /tmp/script.log
3. 脚本锁机制
- 使用文件锁或其他机制,避免并发执行问题。
- 示例:使用
flock
锁定文件。flock -o 200:/path/to/lockfile ./script.sh
4. 防止脚本hang
- 在周期性执行的脚本中,定期清理过期进程或文件,避免hang。
- 示例:定期检查并重启服务。
while true; do ps -ef | grep -w service > /tmp/service_status.log sleep 60done
5. 避免集中发布风险
- 分散发布文件,避免存储端口拥堵或防火墙限制。
示例:
# 分散上传文件for i in 1..3; do curl -u user:pass --ftp-create-dirs --upload-file file$i $(echo "ftp://ftp_ip:ftp_port/path/$i/file$i")done
6. 避免文件无限增长
- 定期清理日志或临时文件,避免文件占用过多。
- 示例:定期清理旧日志。
find /path/to/logs -cmin 7 -delete
四、总结
通过规范化Shell脚本开发,避免常见坑点,并结合运维场景规避风险,我们可以更安全、高效地完成自动化运维任务。从这些经验中可以看出,规范化的脚本定义、严谨的逻辑设计、细节中的用心,都是一个优秀脚本开发人员的标志。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年05月11日 08时01分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux学习笔记(一)
2023-02-04
Linux学习笔记(一):常用命令(1)
2023-02-04
linux学习笔记(打包压缩工具)
2023-02-04
Linux学习笔记:btrfs
2023-02-04
Linux学习资料-6(压缩的用途与技术)
2023-02-04
Linux安全与密钥登录指南,零基础入门到精通,收藏这篇就够了
2023-02-04
Linux安全加固速查手册:22条高效防护策略,零基础入门到精通,收藏这一篇就够了
2023-02-04
Linux安全基线加固实战
2023-02-04
Linux安全策略selinux详解
2023-02-04
Linux安全防护
2023-02-04
Linux安装 vmware workstation
2023-02-04
Linux安装Anaconda3过程详解
2023-02-04
linux安装composer及安装yii2
2023-02-04
Linux安装gcc/gcc-c++
2023-02-04
linux安装HelixServer实现视频分发播放
2023-02-04
linux安装jdk
2023-02-04
Linux安装JDK 17
2023-02-04
Linux安装JMeter进行压力测试
2023-02-04
Linux安装KVM
2023-02-04