Shell编程入门到实战:从基础语法到自动化脚本
在Linux世界中,Shell是用户与内核之间的"翻译官",它接收用户输入的命令,解释并传递给操作系统执行,再将结果反馈给用户。这种交互既可以是实时输入命令的交互式操作,也可以是通过脚本文件批量执行的非交互式操作。
1.1 Shell的本质与分类
Shell本质上是一个命令解释器程序,用C语言编写而成。常见的Shell解释器包括:
- bash:大多数Linux发行版(如CentOS、RedHat)的默认Shell,兼容sh且功能更丰富
- sh:早期的Bourne Shell,很多系统中已作为bash的软链接
- csh/tcsh:类C语言语法的Shell
- zsh:功能强大的增强型Shell,兼容bash
通过cat /etc/shells
命令可查看系统支持的所有Shell类型,而/etc/passwd
文件记录了用户默认使用的Shell。
1.2 为什么学习Shell脚本?
Shell脚本将一系列Linux命令按逻辑组织到文件中,实现自动化执行,其核心价值在于:
- 自动化运维:批量部署服务、添加用户、备份数据等
- 效率提升:替代重复的手动操作,减少人为错误
- 系统集成:衔接不同命令和程序,实现复杂业务逻辑
二、Shell脚本基础:从编写到执行
2.1 脚本的基本结构
一个标准的Shell脚本包含三部分:
#!/bin/bash # 解释器声明,指定脚本由bash执行
# 这是注释内容,用于说明脚本功能
echo "Hello World!" # 可执行语句,输出字符串
2.2 脚本执行的四种方式
-
当前路径执行(需执行权限):
chmod +x hello.sh # 赋予执行权限 ./hello.sh # 相对路径执行
-
解释器直接运行(无需执行权限):
bash hello.sh 或 sh hello.sh
-
source命令加载(影响当前Shell环境):
./hello.sh或 /opt/hello.sh
- 管道输入执行:
cat hello.sh | bash
三、核心语法:变量、输入输出与运算
3.1 变量:数据存储的基本单元
-
定义规则:变量名=值(等号两侧无空格),如
name="shell"
-
命名规范:以字母开头,可包含数字和下划线,区分大小写
-
使用方法:通过
$变量名
或${变量名}
调用,如echo $name
-
-
特殊类型:
- 只读变量:
readonly pi=3.14
(无法修改或删除)
- 只读变量:
3.2 输入输出重定向
Shell默认通过键盘输入、显示器输出,重定向可改变数据流方向:
- 输出重定向:
-
command > file
:覆盖写入文件 -
command >> file
:追加写入文件 -
command 2> error.log
:错误信息写入文件
用ls 看这个不存在的文件把信息记录在error.log
vim 查看error文件的内容
-
command &> all.log
:所有输出(包括错误)写入同一文件
例如:如果脚本里有 echo “备份开始…”(正常输出)和 tar: 无法打开文件(错误输出),两者都会被写入 backup.log。
# 场景:运行脚本,把所有输出(日志、报错)存到all.log
-
./backup_script.sh &> backup.log
- **输入重定向**:```bash# 从文件读取输入代替键盘passwd --stdin user < password.txt
例如:
-
新建密码文件(内容为 “123456”,仅一行)
echo “123456” > password.txt -
用 root 给 user 设置密码(非交互)
sudo passwd --stdin user < password.txt
-
验证:su - user 后,用 123456 登录
- 管道操作:通过
|
将前一个命令的输出作为后一个命令的输入:# 查找包含bash的用户并提取用户名 grep "bash" /etc/passwd | awk -F: '{print $1}'
3.3 运算符与表达式
-
算术运算:
# 三种常用方式 echo $((1+2)) # 3 echo $[3*4] # 12 echo `expr 10 / 2` # 5(注意运算符两侧需空格)
-
关系运算:仅支持数字比较
-eq
(等于)Equal、-ne
(不等于)Not Equal、-gt
(大于)Greater Than-lt
(小于)Less Than、-ge
(大于等于)Greater than or Equal、-le
Less than or Equal(小于等于)
-
字符串运算:
=
(相等)、!=
(不等)、-z
(空字符串)、-n
(非空字符串)
四、流程控制:构建脚本逻辑
4.1 条件判断:if-else语句
#!/bin/bash
score=$1
if [ $score -ge 90 ]; thenecho "优秀"
elif [ $score -ge 80 ]; thenecho "良好"
elif [ $score -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi
4.2 循环结构:for与while
- for循环:适合已知循环次数的场景
# 数值循环 for ((i=1; i<=5; i++)); doecho "第$i次循环" done
# 列表循环for fruit in apple banana orange; doecho "水果:$fruit"done
- while循环:适合未知循环次数的场景
# 累加1-10的和 count=0 num=1 while ((num <= 10)); docount=$[count + num]let num++ # 自增操作 done echo "总和:$count"
七、学习建议
- 熟悉Linux命令:Shell脚本的本质是命令的组合,掌握
grep
、awk
、sed
等工具能大幅提升脚本能力 - 重视语法细节:注意空格、括号等符号的使用(如
[ ]
前后需空格) - 多写实战脚本:从简单的文件备份、日志分析开始,逐步实现复杂功能
- 善用调试技巧:通过
bash -x 脚本名
查看脚本执行过程,定位错误
Shell编程是Linux运维的必备技能,掌握它能让你从重复的手动操作中解放出来,实现真正的自动化运维。从今天开始,动手编写你的第一个Shell脚本吧!