### Linux常用Shell脚本知识点详解
#### 一、文件类型判断与操作脚本
##### 场景背景
在日常的Linux运维工作中,经常会遇到需要判断文件类型并进行相应操作的需求,比如判断某个文件是否为字符设备文件,并将其移动到特定目录。
##### 脚本示例
```bash
#!/bin/sh
FILENAME=""
echo "Input filename:"
read FILENAME
if [ -c "$FILENAME" ]; # 判断文件是否为字符设备文件
then
cp "$FILENAME" /dev # 如果是,则复制到/dev目录
fi
```
**知识点解析:**
1. **基本语法**:
- `#!/bin/sh` 指定了脚本解释器为 `/bin/sh`,这是大多数Linux系统的默认shell。
- 变量定义:如 `FILENAME=""`,用于存储输入的文件名。
- 条件判断语句:`if [ -c "$FILENAME" ]`,`-c` 用于检查文件是否为字符设备文件。
- 文件操作命令:`cp "$FILENAME" /dev`,使用 `cp` 命令将文件复制到 `/dev` 目录。
2. **逻辑结构**:
- 用户交互:通过 `echo` 和 `read` 实现用户输入提示及接收输入。
- 条件分支:使用 `if...then...fi` 结构实现逻辑判断。
3. **应用场景**:
- 在自动化部署或维护过程中,对于特定类型的文件进行识别和处理,如设备文件、配置文件等。
#### 二、批量用户创建与管理脚本
##### 场景背景
在Linux系统管理中,常常需要批量创建用户账户及其对应的主目录,并将其加入指定的用户组。
##### 脚本示例
```bash
#!/bin/sh
i=1
groupadd class1 # 创建用户组
while [ $i -le 30 ]; do
if [ $i -le 9 ]; then
USERNAME="stu0$i"
else
USERNAME="stu$i"
fi
useradd $USERNAME # 创建用户
mkdir /home/$USERNAME # 创建用户主目录
chown -R $USERNAME /home/$USERNAME # 设置用户为主目录所有者
chgrp -R class1 /home/$USERNAME # 将用户主目录加入指定用户组
i=$((i + 1))
done
```
**知识点解析:**
1. **基本语法**:
- 循环结构:`while...do...done`,用于循环执行批量操作。
- 条件判断:`if...then...else...fi`,用于根据不同条件生成不同的用户名。
- 用户操作命令:`useradd`, `mkdir`, `chown`, `chgrp` 分别用于创建用户、创建目录、设置目录所有者以及修改目录所属组。
2. **逻辑结构**:
- 初始化变量:`i=1`,用于计数。
- 用户名生成:根据用户数量动态生成不同的用户名。
3. **应用场景**:
- 大规模用户创建场景,例如学校或企业内部用户的自动化创建和管理。
#### 三、批量账户删除脚本
##### 场景背景
当不再需要某些用户时,可以通过脚本批量删除这些用户的账号。
##### 脚本示例
```bash
#!/bin/sh
i=1
while [ $i -le 50 ]; do
userdel -r stud$i # 删除用户
i=$((i + 1))
done
```
**知识点解析:**
1. **基本语法**:
- 循环结构:`while...do...done`。
- 用户删除命令:`userdel -r`,其中 `-r` 参数表示同时删除用户的主目录。
2. **逻辑结构**:
- 初始化变量:`i=1`。
- 循环递增:`i=$((i + 1))`。
3. **应用场景**:
- 当需要清理大量不再使用的用户账户时,可以使用此类脚本来提高效率。
#### 四、自动化任务脚本
##### 场景背景
为了提高工作效率,系统管理员需要通过脚本自动化执行重复性的日常任务,如定时清理文件、数据备份等。
##### 脚本示例
```bash
# 编写定时任务文件
50 16 * * * rm -r /abc/* # 删除/abc目录下的全部子目录和文件
0 8-18/1 * * * cut -f1 /xyz/x1 >> /backup/bak01.txt # 每小时读取/xyz目录下x1文件中每行第一个域的数据
50 17 * * * tar zcvf backup.tar.gz /data # 星期一下午5:50将/data目录下的所有目录和文件归档并压缩
55 17 * * * umount /dev/hdc # 下午5:55将IDE接口的CD-ROM卸载
# 使用crontab执行定时任务
crontab prgx
```
**知识点解析:**
1. **Cron定时任务**:
- Cron 表达式格式:`分钟 小时 日 月 星期`。
- 常用命令:`rm`, `cut`, `tar`, `umount`。
- 特殊符号:`*` 表示任何值,`-` 表示范围,`,` 表示列表。
2. **逻辑结构**:
- 定义定时任务:使用 `crontab` 命令来编辑定时任务文件。
- 任务调度:通过 cron 守护进程自动执行定时任务。
3. **应用场景**:
- 自动化运维任务,如定期清理无用文件、数据备份、日志清理等。
#### 五、定期备份与压缩脚本
##### 场景背景
在Linux系统管理中,定期对关键目录进行备份是非常重要的。例如,每个月的第一天备份并压缩 `/etc` 目录的所有内容,并保存到 `/root/bak` 目录。
##### 脚本示例
```bash
#!/bin/sh
DIRNAME=$(ls /root | grep bak)
if [ -z "$DIRNAME" ]; then
mkdir /root/bak
cd /root/bak
fi
YY=$(date +%y)
MM=$(date +%m)
DD=$(date +%d)
BACKETC="${YY}${MM}${DD}_etc.tar.gz"
tar zcvf "$BACKETC" /etc
echo "fileback finished!"
```
**知识点解析:**
1. **基本语法**:
- 文件路径操作:`ls /root | grep bak`,用于检查目录是否存在。
- 日期获取:`date +%y`, `date +%m`, `date +%d`,分别获取当前的年、月、日。
- 文件压缩:`tar zcvf`,其中 `z` 表示使用 gzip 进行压缩。
2. **逻辑结构**:
- 目录创建与切换:确保备份目录存在。
- 文件命名:根据当前日期生成备份文件名称。
3. **应用场景**:
- 数据备份:适用于系统配置文件或其他关键数据的定期备份。
#### 六、定期文件备份脚本
##### 场景背景
在实际应用中,有时需要定期备份某个目录下的文件,例如每周日凌晨零点零分定期备份 `/user/backup` 目录下的文件到 `/tmp`。
**示例代码**:
```bash
echo "0 0 * * 0 /bin/sh /usr/bin/fileback" > /root/etcbakcron
crontab /root/etcbakcron
```
**知识点解析:**
1. **Cron定时任务**:
- 定义任务:`0 0 * * 0 /bin/sh /usr/bin/fileback` 表示每周日(星期天)凌晨零点零分执行 `/usr/bin/fileback` 脚本。
- 执行任务:通过 `crontab` 命令加载定时任务。
2. **逻辑结构**:
- 任务定义:通过 Cron 表达式设置定时任务。
- 任务加载:使用 `crontab` 命令加载定时任务文件。
3. **应用场景**:
- 自动化备份:适用于定期备份特定目录下的文件,确保数据安全。
通过以上分析,我们可以看到Shell脚本在Linux系统管理中扮演着非常重要的角色,无论是单个文件的处理、批量用户的创建与管理、还是自动化任务的执行,都能够大大提高工作效率。熟练掌握这些基础脚本的编写技巧对于Linux运维人员来说至关重要。