1. Shell自动化编程概述
Shell脚本是Linux/Unix系统管理员和开发人员的必备技能之一。通过编写Shell脚本,我们可以将日常重复性工作自动化,大幅提升工作效率。本指南将从基础语法到高级应用,全面讲解Shell自动化编程的方方面面。
提示:学习Shell编程需要动手实践,建议读者在阅读时同步在Linux环境中操作验证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Shell编程基础与变量
2.1 环境准备与Vim配置
在开始编写Shell脚本前,合理的编辑器配置能显著提升编码效率。以下是推荐的Vim配置(保存为~/.vimrc或/etc/vimrc):
bash复制set ignorecase " 搜索时忽略大小写
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2,"########################################################")
call setline(3, "# File Name:".expand("%"))
call setline(4, "# Version:V1.0")
call setline(5, "# Author:liux")
call setline(6, "# Desc:")
call setline(7,"########################################################")
endif
endfunc
这个配置实现了:
- 自动为新建的.sh文件添加标准头部注释
- 忽略搜索时的大小写差异
- 支持多种编程语言的模板
2.2 Shell脚本执行方式
Shell脚本有多种执行方式,各有适用场景:
| 执行方式 | 特点 | 适用场景 |
|---|---|---|
| sh script.sh | 使用sh解释器执行 | 兼容性最好 |
| bash script.sh | 使用bash解释器执行 | 需要bash特有功能时 |
| ./script.sh | 需要可执行权限,使用脚本首行指定的解释器 | 生产环境常用 |
| source script.sh | 在当前Shell环境中执行,可访问和修改当前环境变量 | 需要修改当前环境时 |
| . script.sh | 同source | 简写形式 |
2.3 实用脚本示例:登录信息展示
以下脚本会在用户登录时显示系统基本信息:
bash复制#!/bin/bash
########################################################
# File Name:02.sys_login_info.sh
# Version:V1.0
# Author:liux
# Desc:用户登录后显示系统基本信息
########################################################
# 1. 获取系统信息
sys_hostname=$(hostname)
sys_ip_addrs=$(hostname -I)
sys_mem_total=$(free -h |awk 'NR==2{print $2}')
sys_mem_free=$(free -h |awk 'NR==2{print $NF}')
sys_load=$(uptime |awk '{print $(NF-2),$(NF-1),$NF}')
# 2. 格式化输出
cat <<EOF
主机名: ${sys_hostname}
IP地址: ${sys_ip_addrs}
总内存: ${sys_mem_total}
可用内存:${sys_mem_free}
系统负载:${sys_load}
EOF
# 3. 创建软链接使登录时自动执行
ln -s /server/scripts/devops-shell/02.sys_login_info.sh /etc/profile.d/sys_login_info.sh
关键点说明:
hostname -I获取所有IP地址free -h以人类可读格式显示内存信息uptime显示系统负载/etc/profile.d/目录下的.sh文件会在用户登录时自动执行
2.4 Shell特殊变量详解
2.4.1 位置变量
| 变量 | 含义 | 应用场景 |
|---|---|---|
| $n | 脚本的第n个参数 | 接收命令行参数 |
| $0 | 脚本名称 | 错误提示、帮助信息 |
| $# | 参数个数 | 参数校验 |
| $@ | 所有参数(可迭代) | 需要逐个处理参数时 |
| $* | 所有参数(单个字符串) | 需要将所有参数作为整体处理时 |
2.4.2 状态变量
| 变量 | 含义 | 应用场景 |
|---|---|---|
| $? | 上条命令的退出状态 | 错误检查与流程控制 |
| $$ | 当前脚本的PID | 生成临时文件或日志命名 |
| $! | 最后一个后台进程的PID | 监控后台进程 |
2.4.3 变量子串操作
bash复制${#var} # 获取变量长度
${var:start:length} # 提取子串
${var#pattern} # 删除最短匹配前缀
${var##pattern} # 删除最长匹配前缀
${var%pattern} # 删除最短匹配后缀
${var%%pattern} # 删除最长匹配后缀
3. Shell运算符与条件表达式
3.1 Shell运算方法比较
Shell支持多种运算方式,各有特点:
| 方法 | 精度 | 需要安装 | 适用场景 |
|---|---|---|---|
| awk | 浮点 | 通常已装 | 复杂计算、格式化输出 |
| bc | 浮点 | 可能需要 | 高精度计算 |
| expr | 整数 | 内置 | 简单计算、参数检查 |
| let | 整数 | 内置 | 变量自增/自减 |
| $(()) | 整数 | 内置 | 算术运算 |
| $[] | 整数 | 内置 | 算术运算(已过时) |
3.1.1 awk计算示例
bash复制# 基本计算
awk 'BEGIN{print 1/3}'
awk 'BEGIN{print 1/3*100}'
# 使用Shell变量
n1=1
n2=3
awk -vn1=$n1 -vn2=$n2 'BEGIN{print n1/n2}'
3.1.2 bc计算示例
bash复制# 基本计算
echo "1/3" | bc -l
echo "2^10" | bc -l
