服务公告
Shell 脚本入门:变量、判断与循环
发布时间:2025-11-06 14:58
## 场景 每晚要做的备份、清理与巡检,手工执行既费时也容易漏步骤:今天记得清日志,明天忘了查磁盘,问题往往就出在漏掉的那一步上。把这些动作写成一个脚本,交给定时任务执行,是运维自动化的第一步。一个能长期稳定运行的脚本,骨架其实很短,抓住变量、判断与循环三个要素,再配上严格的错误处理,就能覆盖大部分日常场景。 ## 最小骨架 ``` #!/usr/bin/env bash set -euo pipefail LOG_DIR=/var/log/myapp KEEP_DAYS=7 if [ ! -d "$LOG_DIR" ]; then mkdir -p "$LOG_DIR" fi for f in "$LOG_DIR"/*.log; do echo "found $f" done ``` 第一行指定解释器,缺了它某些调用方式会退回系统默认 shell。set -euo pipefail 让命令失败、变量未定义或管道中断时脚本立即退出,是防错价值最高的一行,宁可失败退出,也不要带着错误状态继续往下跑。变量赋值时等号两侧不留空格,引用变量养成加双引号的习惯,路径带空格也不会被拆成两个参数。 ## 判断与循环的常用写法 条件判断用 if 配合 test,方括号内侧必须留空格,数字比较用 -eq 与 -lt 这类操作符,字符串比较用等号,两者不能混用。循环最常用的是 for 遍历列表与 while 逐行读取文件。 ``` count=0 while read -r line; do count=$((count + 1)) done < input.txt echo "total $count" ``` 重复逻辑封装成函数,先定义后调用,参数用位置变量取用,脚本超过百行就该考虑拆函数了。判断逻辑里最常见的形态是检查上一条命令的退出码,用 if mkdir -p "$LOG_DIR" 直接判断成败,比事后查返回值更紧凑;对可能不存在的文件先做判空再引用,能挡住 set -u 报的未定义错误。 ## 验证与常见坑 写完先用 bash -n 做语法检查,再手动跑一遍覆盖关键分支,最后才挂进定时任务。新手常踩的坑有:在本地编辑器保存成带回车符的格式,上传后报 bad interpreter,用 dos2unix 转换即可;比较符号两侧忘留空格导致语法错误;在管道子 shell 里修改变量,循环结束值带不回来。顺云云服务器上跑定时脚本时,脚本内路径一律写绝对路径,避免不同会话环境差异带来的意外。上一篇: 服务器采购从买断到租用的演变
下一篇: 长期运营服的降配与升级时机