Shell编程详细笔记
一、Shell简介
什么是Shell?
- Shell是命令解释器,负责将用户输入的命令传递给内核执行,并将结果返回给用户。
- 分为交互式(与人交互)和非交互式(如脚本执行)两种方式。
为什么学习Shell?
- 自动化运维:自动化安装系统、部署服务、更新代码等。
- 系统优化与安全:关闭无用服务、优化SSH、内核参数调整等。
- 服务部署与管理:安装Nginx、Tomcat、Zabbix等服务。
- 日志分析与监控:日志切割、IP统计、自定义监控等。
- 脚本串联与任务调度:定时任务结合Shell脚本实现自动化。
二、学习Shell所需知识
- SSH客户端:Xshell、CRT
- 编辑器:Vim
- 常用Shell命令
- 文本处理三剑客:
awk、grep、sed - 常用服务配置与管理
三、如何学好Shell编程
学习路径:
- 掌握变量和表达式
- 阅读并理解他人脚本
- 模仿编写 → 独立编写 → 优化脚本
- 形成自己的编码风格
- 理解原理,避免“拿来即用”
- 参考案例丰富的书籍(如《跟老男孩学习Shell》)
四、Shell脚本基础
1. Shell脚本书写规范
- 文件名以
.sh结尾 - 首行指定解释器:
#!/bin/bash - 包含作者和注释信息
- 尽量使用英文
- 符号必须为英文符号,如
""、''、{}、[]等
2. 创建与执行脚本
# 示例脚本:test.sh
#!/bin/bash
echo "Hello, Shell!"
三种执行方式:
- 直接使用解释器执行(无需执行权限)
sh test.sh
- 路径执行(需执行权限)
chmod +x test.sh
./test.sh # 相对路径
/root/test.sh # 绝对路径
- 使用
.或source执行(在当前Shell中执行)
. test.sh
source test.sh
第1、2种方式在子Shell中执行,第3种在父Shell中执行。
五、Shell变量
1. 变量分类
- 环境变量(全局变量):系统定义,对所有Shell生效,如
$PATH - 普通变量(局部变量):用户自定义,仅当前Shell生效
2. 变量生存周期
- 临时变量:直接定义或使用
export定义 - 永久变量:写入配置文件(如
/etc/profile)
3. 变量定义规范
- 命名:字母、数字、下划线,不以数字开头
- 大小写:推荐全大写(如
NAME_AGE)或驼峰式(如Name_Age) - 赋值:等号两侧不能有空格
4. 变量赋值类型
# 字符串
dir="/etc/sysconfig"
test="a b c"
# 数字
age=18
# 命令结果赋值
count=$(cat /etc/passwd | wc -l)
count=`cat /etc/passwd | wc -l`
5. 引号使用
- 单引号
'':所见即所得,不解析变量 - 双引号
"":可解析变量 - 反引号
`或$():执行命令并返回结果
六、Shell位置变量与状态变量
位置变量:
$0:脚本名称$1、$2…$n:第1、2…n个参数$#:参数个数$*、$@:所有参数(区别在于循环中的解析方式)${10}:从第10个参数开始需使用{}
状态变量:
$?:上一条命令的退出状态(0为成功)$$:当前脚本的PID$!:最后一个后台进程的PID$_:上一个命令的最后一个参数
七、Shell传参方式
1. 直接传参
sh script.sh arg1 arg2
脚本内使用 $1、$2 获取。
2. 赋值传参
a=$1
b=$2
3. read 交互式输入
read -p "请输入姓名:" name
echo "姓名:$name"
八、常用案例
1. 检查参数个数
if [ $# -ne 2 ]; then
echo "请输入两个参数"
exit 1
fi
2. 使用位置变量
echo "脚本名:$0"
echo "第一个参数:$1"
echo "参数总数:$#"
3. 检查命令执行状态
ping -c1 -w1 $1 &>/dev/null
if [ $? -eq 0 ]; then
echo "$1 可达"
else
echo "$1 不可达"
fi
九、变量配置文件
| 文件 | 说明 |
|---|---|
/etc/profile | 系统级配置文件,登录时执行 |
~/.bash_profile | 用户级配置文件 |
~/.bashrc | 用户Shell配置 |
/etc/bashrc | 全局Shell配置 |
十、学习建议总结
- 理解变量与表达式是基础
- 多读、多写、多调试
- 形成自己的脚本风格
- 理解原理,不盲目复制
- 善用工具书与案例
- 结合实际场景练习(如系统监控、日志分析、服务部署)
Comments NOTHING