本文共 2632 字,大约阅读时间需要 8 分钟。
在系统运维与应用运维领域,自动化运维的进程从“纯手工”到“脚本化”再到“自动化”与“智能化”是一个逐步深化的过程。其中,Shell脚本作为自动化运维的重要工具,在运维工作中发挥着不可替代的作用。本文将分享在Shell脚本开发过程中积累的经验与教训,供运维工作者和脚本开发人员参考。
脚本的开头应包含以下要素:
格式示例:
#!/bin/bash# 脚本名称: 服务器备份脚本# 参数说明: $1表示源服务器IP地址,$2表示备份服务器IP地址# 作者: 张三# 创建日期: 2023-10-01# 版本: v1.0
case
命令时,确保选项完全匹配。示例:
case "选项" in "选项1") 指令 ;; "选项2") 指令 ;; *) echo "错误选项" ;;
在脚本执行前,需验证所有未定义变量或命令返回值是否为非零,避免脚本运行异常。
示例:
set -eo pipefail
rm
、mv
等),建议使用mv
替代rm
并转入垃圾箱。rm
时,建议使用find
结合delete
选项,避免误删。示例:
find /path/to/dir -delete
*
和?
时,应根据最精确匹配原则,避免使用*
过度匹配。*
,如:rm /path/to/*.*
*
或?
,如:ls /path/to/??????????*
示例:
value=10is_number=$value
示例:
if [[ "$var" == "条件" ]]; then
示例:
tar -cf - /path/to/file | gzip > file.gz
ps
筛选进程时,若已知进程所属用户,应在参数中指定。示例:
ps -ef | grep -w user | grep -v grep
>
替代cp
>
修改文件时,保留原文件的属组和权限,避免cp
操作带来的权限问题。示例:
cat file > newfile
kill
前确认-w
精确匹配进程,避免误杀。ps
输出结果时,需保留现场信息,避免多杀或误杀。示例:
ps -ef | grep -w进程名 | grep -v grep > /tmp/kill_进程名_.backup
rm
前确认find
遍历根目录,直接使用文件名删除。示例:
find /path/to/dir -delete
in
条件需按空格分隔,避免进入死循环。示例:
for i in "a b c" do
while
循环中使用管道,避免变量无法正确获取。示例:
while read -r line; do
cp
的空格问题示例:
cp "文件名 - 开头" /path/to/dir
cd
易错问题cd
可能导致执行命令路径错误,需检查返回值。cd
影响父shell。示例:
( cd /path/to/dir && ls )
[
代替[
错误[
无法正确处理,应使用[[ ]]
。示例:
[[ "$var" = "值" ]]
示例:
cat file | tee stdout stderr
cd
路径错误cd
返回值不为零时,需使用||
执行后续命令。示例:
cd /path/to/dir || echo "路径错误"
expect
或curl
实现简单交互。curl -u user:pass --ftp-create-dirs --upload-file file /path/to/server
#!/bin/bashecho "脚本执行说明:$0 $1 $2 ..."exec 2>&1 > /tmp/script.log
flock
锁定文件。flock -o 200:/path/to/lockfile ./script.sh
while true; do ps -ef | grep -w service > /tmp/service_status.log sleep 60done
示例:
# 分散上传文件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
find /path/to/logs -cmin 7 -delete
通过规范化Shell脚本开发,避免常见坑点,并结合运维场景规避风险,我们可以更安全、高效地完成自动化运维任务。从这些经验中可以看出,规范化的脚本定义、严谨的逻辑设计、细节中的用心,都是一个优秀脚本开发人员的标志。
转载地址:http://sgzfk.baihongyu.com/