Linux写shell脚本是系统管理员和开发人员提升工作效率的重要技能,通过编写脚本可以自动化重复性任务、简化复杂操作,实现系统管理的智能化,Shell脚本基于Linux命令行环境,结合系统命令、变量、流程控制等元素,能够高效完成文件处理、系统监控、数据备份等任务。
Shell脚本基础结构
一个规范的Shell脚本通常以#!/bin/bash
开头,称为Shebang行,用于指定解释器,脚本主体包括注释区和代码区,注释以开头,用于说明脚本功能、参数及注意事项。
#!/bin/bash # 功能:每日备份指定目录 # 作者:admin # 日期:2023-10-01 backup_dir="/var/backup" source_dir="/home/user/data" timestamp=$(date +%Y%m%d) tar -czf $backup_dir/backup_$timestamp.tar.gz $source_dir echo "备份完成:backup_$timestamp.tar.gz"
变量与数据类型
Shell脚本中的变量无需声明类型,直接赋值即可使用,变量命名需遵循字母、数字、下划线组合,且不能以数字开头,按作用范围分为局部变量(如name="test"
)和环境变量(如$PATH
),特殊变量用于参数传递,如$1
表示第一个参数,获取上一条命令的返回状态。
变量类型 | 示例 | 说明 |
---|---|---|
用户变量 | count=10 |
用户自定义,需使用引用 |
位置变量 | $1, $2 |
脚本执行时的参数 |
预定义变量 | 参数个数、最后后台进程ID |
流程控制语句
条件判断
if
语句通过test
命令或[]
进行条件测试,支持文件测试(-e
存在、-r
可读)、数值比较(-eq
等于、-gt
大于)和字符串比较(等于、不等于)。
if [ $1 -gt 100 ]; then echo "数值大于100" else echo "数值小于等于100" fi
循环结构
for
循环适用于遍历列表,while
循环用于条件循环,例如批量处理文件:
for file in *.log; do mv $file ${file%.log}.bak done
函数与模块化
函数通过function_name() { commands; }
定义,支持参数传递和返回值,合理使用函数可提高脚本复用性,
log_message() { echo "[$(date)] $1" >> /var/log/script.log } log_message "脚本启动"
实战应用示例
系统监控脚本
#!/bin/bash # 监控CPU使用率超过80%的进程 threshold=80 ps -eo pid,ppid,cmd,%cpu --sort=-%cpu | awk -v threshold=$threshold ' NR>1 && $4>=threshold { print "警告:进程 " $3 " (PID: " $1 ") CPU使用率 " $4 "%" }'
文件批量处理脚本
#!/bin/bash # 将当前目录下所有.txt文件转为UTF-8编码 for file in *.txt; do iconv -f gbk -t utf-8 "$file" -o "${file%.txt}_utf8.txt" done echo "转换完成"
调试与优化
调试时可使用bash -x script.sh
执行脚本,显示每条命令的执行结果,优化建议包括:使用$(command)
代替反引号、避免无意义的变量、添加错误检查(如if [ $? -ne 0 ]; then echo "失败"; exit 1; fi
),对于复杂脚本,建议采用模块化设计,通过函数拆分功能逻辑,提高可读性和维护性。
掌握Shell脚本的编写需要不断实践,从简单的命令组合到复杂的逻辑处理,逐步积累经验,通过合理运用变量、流程控制和函数,可以充分发挥Linux系统的自动化能力,显著提升工作效率。