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系统的自动化能力,显著提升工作效率。



















