1. 什么是Shell和Shell脚本?¶
在Linux世界里,我们通过命令行与系统交互,而Shell就是这个交互的“中间人”——它是用户与Linux内核之间的接口程序。你可以把它理解为一个命令解释器,负责接收你输入的命令,然后传递给系统内核执行。
常见的Shell有很多种,比如bash(Bourne-Again Shell,大多数Linux默认使用)、sh(Bourne Shell)、zsh等。而Shell脚本,就是把一系列Linux命令按顺序写入一个文本文件,通过Shell解释器批量执行,从而实现自动化任务。
举个例子:如果你每天都需要手动执行“备份文件”“清理日志”“检查系统状态”等重复操作,用Shell脚本写一遍,以后直接运行脚本就能自动完成,不用每次手动敲命令。
2. 为什么要学Shell脚本?¶
自动化是核心价值。掌握Shell脚本能帮你:
- 提高效率:批量处理文件(如重命名、格式转换)、定时任务(如日志清理)。
- 系统管理:监控服务器状态(如磁盘使用率、CPU占用)、自动部署服务。
- 跨平台复用:脚本可在不同Linux系统间通用,兼容性强。
对初学者来说,Shell脚本语法简单,上手快,是Linux入门的必备技能。
3. 编写第一个Shell脚本:Hello World¶
步骤1:准备编辑器
Linux系统自带文本编辑器,新手推荐用nano(更简单)或vim(更强大)。
以nano为例:在终端输入nano hello.sh,会打开一个空白编辑窗口。
步骤2:编写脚本内容
在编辑器中输入以下内容(注意每一行的作用):
#!/bin/bash
# 这是一个Shell脚本示例
echo "Hello, Linux! 你好,世界!"
#!/bin/bash:指定脚本使用bash解释器(必须放在第一行,否则可能无法识别)。#开头的是注释,仅作说明,不会被执行。echo是输出命令,用于打印文本到屏幕。
步骤3:保存并退出
- 在nano中,按Ctrl+O保存,按Enter确认文件名;再按Ctrl+X退出。
步骤4:赋予执行权限
脚本默认是“只读”的,需要添加执行权限:
chmod +x hello.sh
chmod +x:给文件添加“可执行”权限。
步骤5:运行脚本
在终端执行:
./hello.sh
- 输出结果:
Hello, Linux! 你好,世界! - 注意:如果提示“权限不足”,确认步骤4已正确执行;如果提示“文件不存在”,检查当前目录是否是脚本所在位置(用
pwd查看当前目录,ls查看文件列表)。
4. Shell脚本的基本语法与常用命令¶
变量:Shell脚本中变量名需以字母或下划线开头,赋值时等号两侧无空格。
示例:
name="小明"
age=20
echo "姓名:$name,年龄:$age" # 使用变量时加$前缀
- 运行结果:
姓名:小明,年龄:20
常用执行命令:
- echo "文本":输出文本(最常用)。
- pwd:显示当前工作目录。
- ls [目录]:列出指定目录下的文件(默认当前目录)。
- cd [路径]:切换目录(如cd ~返回用户主目录)。
- date:显示当前系统时间。
注释:
单行注释:# 这是单行注释
多行注释:
: '
这是多行注释
可以写很多行
'
5. 条件判断(if-else)¶
当需要根据条件执行不同操作时,用if-else结构。语法如下:
if [ 条件表达式 ]; then
条件成立时执行的代码
elif [ 另一条件 ]; then
条件成立时执行的代码
else
所有条件不成立时执行的代码
fi # 结束if结构(必须写)
示例1:判断数值是否大于10
num=15
if [ $num -gt 10 ]; then # -gt表示“大于”
echo "$num 大于10"
elif [ $num -lt 5 ]; then # -lt表示“小于”
echo "$num 小于5"
else
echo "$num 在5到10之间"
fi
- 运行结果:
15 大于10
示例2:判断文件是否存在
file="test.txt"
if [ -f $file ]; then # -f判断是否是普通文件
echo "$file 存在"
else
echo "$file 不存在"
fi
6. 循环(for/while)¶
重复执行代码块时,用循环结构。
for循环:遍历列表
# 遍历1到5并打印
for i in {1..5}; do
echo "第$i次循环"
done
- 运行结果:
第1次循环
第2次循环
第3次循环
第4次循环
第5次循环
while循环:条件满足时重复
# 打印1到5的和
sum=0
i=1
while [ $i -le 5 ]; do # -le表示“小于等于”
sum=$((sum + i)) # 累加(注意$((...))是数值运算)
i=$((i + 1))
done
echo "1到5的和是:$sum" # 输出:15
7. 综合示例:自动备份脚本¶
需求:备份当前目录下所有txt文件到backup目录(不存在则创建),并打印备份状态。
#!/bin/bash
# 定义变量
src_dir="." # 当前目录
backup_dir="./backup"
timestamp=$(date +%Y%m%d_%H%M%S) # 获取时间戳作为备份文件名前缀
# 创建备份目录(如果不存在)
if [ ! -d $backup_dir ]; then
mkdir $backup_dir
echo "创建备份目录:$backup_dir"
fi
# 遍历所有txt文件并备份
txt_files=$(ls $src_dir/*.txt 2>/dev/null) # 忽略无txt文件时的错误
if [ -z "$txt_files" ]; then
echo "当前目录没有txt文件,无需备份"
else
for file in $txt_files; do
cp $file $backup_dir/$(basename $file)_$timestamp.txt
echo "已备份:$(basename $file)"
done
echo "备份完成!备份文件在:$backup_dir"
fi
- 执行步骤:
1. 保存为backup.sh,chmod +x backup.sh
2. 运行:./backup.sh
8. 进阶建议¶
- 学习工具:掌握
grep(文本搜索)、awk(文本处理)、find(文件查找)等工具,提升脚本能力。 - 练习方式:从修改示例脚本开始(如添加参数、调整条件),逐步尝试复杂场景(如定时任务
crontab)。 - 调试技巧:在脚本开头加
set -x开启调试模式,查看执行过程。
Shell脚本入门门槛低,但深入需长期实践。从简单重复任务开始,你会发现它能极大提升Linux操作效率!