Linux学习总结(77)—— Shell 开发运维经验总结
发布日期: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. 环境变量与文件操作

  • 对于敏感操作(如rmmv等),建议使用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. 支持交互式脚本

  • 使用expectcurl实现简单交互。
  • 示例: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脚本开发,避免常见坑点,并结合运维场景规避风险,我们可以更安全、高效地完成自动化运维任务。从这些经验中可以看出,规范化的脚本定义、严谨的逻辑设计、细节中的用心,都是一个优秀脚本开发人员的标志。

上一篇:Linux学习总结(78)—— 常见开源协议讲解
下一篇:Linux学习总结(76)—— Shell 脚本日志技巧

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年05月11日 08时01分57秒