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.shchmod +x backup.sh
    2. 运行:./backup.sh

8. 进阶建议

  • 学习工具:掌握grep(文本搜索)、awk(文本处理)、find(文件查找)等工具,提升脚本能力。
  • 练习方式:从修改示例脚本开始(如添加参数、调整条件),逐步尝试复杂场景(如定时任务crontab)。
  • 调试技巧:在脚本开头加set -x开启调试模式,查看执行过程。

Shell脚本入门门槛低,但深入需长期实践。从简单重复任务开始,你会发现它能极大提升Linux操作效率!

小夜