Shell入门——基础知识+实战_在线视频教程-CSDN程序员研修院
Shell是Linux和Unix系统中常用的一种脚本编程语言,它凭借着简洁、高效的特点,成为了许多专业人士的首选工具。通过Shell脚本,我们可以实现自动化任务的执行、系统管理和运维等多种功能,极大地提高了工作效率。无论是系统管理员、开发者还是运维工程师,掌握Shell编程都是非常有益的。
先前的一系列博客文章已对Shell编程的基础知识进行了详细阐述,假设读者已掌握相关基础知识。在此基础上,我们将采用理论与实践相结合的方式,通过真实场景的实战演示,使读者在实际操作中深入理解Shell的应用价值和潜力。
在数据量较大时,手动备份不仅耗时且易于出错。此时,编写自动备份脚本便显得至关重要,它能有效提升备份效率并降低风险。又如,在数据分布广泛的情况下,手动备份同样显得诸多不便。通过自动备份脚本,我们能实现任务集中管理,并可自动备份各处数据,从而提高备份效率。此外,若需对备份数据进行加密或压缩,手动备份过程将变得异常复杂。借助自动备份脚本,便能简化这一流程,并按需将备份数据存储至指定位置。因此,编写自动备份脚本实属必要之举。
在这个例子中,我们将详细解释自动备份脚本的大致思路和执行过程。首先,我们需要明确自动备份脚本的目标:实现对特定文件或目录的自动备份。以下是一个具体的案例,展示了如何实现这一目标。
在自动备份脚本中,我们首先定义一个变量backup_files,用于存储需要备份的文件路径。在这个例子中,备份的目标是当前路径下的course目录。
backup_files ?= ?./course
接下来,我们定义另一个变量backup_dir,用于存储备份文件的存放路径。在这个例子中,我们将备份文件放在当前路径下的test目录中。
backup_dir ?= ?./test
由于test目录在开始时并不存在,我们需要使用mkdir命令创建这个备份目录。
mkdir ?-p ?$backup_dir
我们定义一个变量backup_name,用于存储备份文件的名称。这个名称由备份文件的前缀和日期时间戳组成,以确保每次备份生成的文件名都是唯一的。
backup_name="backup-$(date +%Y-%m-%d).tar.gz"
使用tar命令创建一个备份文件,将指定目录(本例中为course目录)及其子目录进行打包和压缩。备份文件将被保存在test目录中,并以当前日期为文件名前缀。
tar -czf $backup_dir/$backup_name $backup_files
通过以上步骤,我们就实现了一个简单的自动备份脚本。
新建一个脚本叫backup.sh,并将它设置为可执行权限chmod +x backup.sh,内容如下:
执行后,终端显示备份完成,确认已成功备份。观察到当前目录下已创建test目录,进入该目录,备份文件已生成。
备份脚本的基本版本已经完成,但我们可以根据需求进一步优化。正如之前所提到的,如果需要备份的数据分布在多个地方,我们应该如何优化脚本呢?
首先,我们需要明确备份数据的位置。如果数据分布在多个地方,我们可以通过在脚本中添加多个备份文件或目录的路径来实现备份多个数据源。这里,我们可以使用数组来存储要备份的数据源路径。这样,我们可以在脚本中通过循环遍历数组,从而备份每个数据源。
像这样,我举个例子:
我们使用名为 backup_files 的数组来存储两个需要备份的数据源路径。通过 for 循环,我们可以逐个处理这些数据源,这是 Bash shell 中常见的数组操作。${backup_files[@]} 是 Bash shell 的数组语法,用于获取 backup_files 数组中的所有元素。@ 符号指示我们获取整个数组,而不是单个元素。为了确保备份文件名的唯一性,我们将备份文件名设置为数据源名称和当前日期的组合。
执行结果:可见两个目录下的文件我们都备份成功了。
此外,我们还可以通过优化自动备份脚本来提高备份效率,将备份频率设置为不同的时间间隔,以便在各个时间段对数据进行备份,从而降低对系统资源的影响。对于大型数据库或文件系统,我们可以在夜间进行备份,这样可以避免在备份过程中对系统性能产生过大影响。
要管理自动备份任务,可以使用Linux操作系统中的cron工具。cron是一个强大的任务调度器,可以用于安排周期性任务,如定时备份。在终端中,您可以使用以下命令来操作cron:
1. ?使用`crontab ?-e`命令打开当前用户的任务计划列表,这将允许您编辑现有任务或添加新任务。
2. ?使用`crontab ?-l`命令列出当前用户的任务列表,以便您了解当前的备份策略和频率。
3. ?如果需要删除当前用户的任务列表,可以使用`crontab ?-r`命令。但在删除任务列表之前,请确保您已经备份了重要数据,以防止丢失。
打开之前:如果第一次打开可能会出现这样四个的选项:
根据提供的选项,用户可以选择四种不同的文本编辑器来编辑任务计划列表。对于初学者或寻求简单易用的人来说,推荐选择/bin/nano编辑器。若您需要更高级的编辑功能,可以选择第二或第三项,它们基于Vim编辑器,但功能相对较少。最后,第四项是一个基础编辑器,需要用户具备一定的命令行操作能力。
在编辑器中,我们添加一个新的行来定义脚本的执行频率和路径。接着,我们添加一个新的计划任务行,保存任务计划列表并退出编辑器。Cron 将自动将新任务添加到计划列表中,并在下一个指定的时间开始执行。例如:
* * * * * user command
在上述格式中,前五个星号代表任务的执行时间和日期。您可以使用数字或特定词汇来表达这个概念。第六个字段,即 user 字段,代表将要执行命令或脚本的用户名。而第七个字段,即 command 字段,则是指向要运行的命令或脚本的路径。
比如:
0 2 24 12 7 ?root ?/home/cjj/samba/backup.sh
该指令表示在12月24日周日上午两点执行备份任务。在完成任务列表的保存后,退出编辑器。Cron将自动将新任务添加至计划列表中。需要注意的是,在使用Cron执行自动备份脚本时,需确保脚本具有正确的执行权限。可通过chmod命令调整文件权限。
定期清理脚本的功能在于自动删除过期或无需的文件,以维护磁盘空间并保持系统性能。在文件创作过程中,我们时常会遗漏对过时或不用的文件进行处理和删除。随着时间的推移,磁盘空间将会不足,进而影响系统性能。为避免此类情况,我们需要定期清理无用的文件和数据。通过编写定期清理脚本,您可以自动化地删除旧文件、清理日志文件、缓存文件以及临时文件,从而释放磁盘空间。由此可见,编写定期清理脚本至关重要。
接下来我们同样举个例子讲解一下定期清理脚本的大概思路:
首先,我们需要明确清理何种文件,因此定义两个变量,一个用于指定清理的目录,另一个用于指定需清理的文件扩展名:
DIRS_TO_CLEAN=("./course/test1" "./course/1-1")
EXTENSIONS_TO_CLEAN=("*.h" "*.d" "*.c")
为了达到一个定期清理的效果,还得设置一个变量也就是清理文件的最大一个时间区间
MAX_FILE_DAY=1
接下来我们就通过循环遍历每个目录和每个文件扩展名来进行删除命令,
首先遍历每一个目录
for dir in "${DIRS_TO_CLEAN[@]}"
do
再接着遍历每一个文件扩展名
for ext in "${EXTENSIONS_TO_CLEAN[@]}"
do
在之前的教程中,我们介绍了如何使用find命令来查找文件和目录。在此基础上,今天我们将深入探讨如何使用find命令的高级参数来实现更复杂的文件查找和删除操作。具体来说,我们将学习如何根据文件扩展名和时间区间条件来查找并删除指定目录下的文件。
首先,让我们回顾一下find命令的基础用法。find命令的语法如下:
find ?[路径] ?[选项] ?[操作]
其中,路径、选项、操作分别是find命令的三个主要部分。路径是指要查找的目录,选项是用于定制查找条件的参数,操作是对找到的文件执行的操作。
接下来,我们将介绍两个find命令常用的选项:-name和-mtime。
-name选项用于按照文件名称模式查找文件。名称模式可以包含通配符,例如*、?、[]等。这使得查找文件变得更加灵活,可以根据文件名的一部分来匹配多个文件。
-mtime选项用于按照文件修改时间查找文件。通过指定参数n,可以找到修改时间距离现在n天的文件。这个选项在我们需要查找特定时间范围内的文件时非常有用。
为了查找到指定文件扩展名和时间区间条件的文件,我们可以结合使用-name和-mtime选项。以下是一个示例命令:
find $dir -name "$ext" -mtime +$MAX_FILE_AGE -delete
这个命令将在指定目录($dir)下查找符合文件扩展名($ext)且修改时间距离现在大于等于$MAX_FILE_AGE天的文件。找到的文件将被删除。
这里我们需要注意,-delete选项是在find命令的最后一条,用于对找到的文件执行删除操作。如果没有这个选项,find命令只会返回符合条件的文件列表,不会实际删除它们。
另外我们再设置一些打印信息,比如说删除完成等信息。
新建一个脚本叫cleanup.sh,并且将其设置为可执行文件,内容如下:
我这里设置的要清理的目录是当前目录下的course/test1下的文件和1-1下的文件,
这两个文件原本的内容是这样的:
然后我将需要清理的文件扩展名设置为.h文件.d文件还有.c文件
执行刚才写好的脚本
再次查看该清理的目录下的文件是否已经删除:
我们已成功实现预期目标,并对部分文件进行了清理。以下提供一个基本定期清理脚本的实例,用户可根据自身需求对其进行优化和定制。为实现脚本的定期运行,您可使用cron或其他计划任务工具,确保其在系统上自动执行,与之前的自动备份操作相同。
接下来我们继续讲解另外一个脚本实战的例子,用户管理脚本。用户管理脚本可以用于管理 Linux 系统上的用户和组,例如创建和删除用户、修改密码、修改用户组等。如果您需要在系统中创建多个用户或者需要删除多个用户以及相关用户的所有信息,手动一个一个操作会非常耗时和繁琐。使用用户管理脚本,可以批量创建或删除用户,大大提高效率。同时还有修改用户密码,列出所有用户等等一些基本操作都可以快速帮助您配置好这些。
接下来我们写一个脚本创建一个用户管理菜单,让我们可以添加、删除、修改密码和列出系统上的所有用户。脚本使用 Bash Shell 的 read 命令来读取用户输入,并使用 case 语句根据用户选择执行相应的操作。
那我们该怎么写呢?接下来举个例子讲解一下用户脚本的大概思路:
首先既然我们要做一个用户管理菜单,我们就需要先做一个菜单界面
打印输出我们的一些功能选项:
echo "User Management Menu"
echo "1. 添加用户"
echo "2. 删除用户"
echo "3. 修改用户密码"
echo "4. 列出所有用户"
echo "5. 退出"
接下来就需要使用read命令来读取用户的输入,也就是选择哪个功能选项:
read -p "Enter your choice [1-5]: " choice
最后就是通过用户输入的功能选项执行相应的朝左,这里我们就想到了前面学到的case语句:
case $choice in
??1)
????# 添加用户
????;;
??2)
????# 删除用户
????;;
??3)
????# 修改用户密码???
????;;
??4)
????# 列出所有用户
????;;
??5)
????# 退出
????exit 0
????;;
??*)
????# 无效选项
????echo "Invalid choice. Please choose again."
????;;
esac
编写用户管理脚本可能涉及到多个系统命令和操作,因此需要一定的 Linux 系统管理经验。
框架完成之后,我们就开始完善这个脚本,当用户选择1时,我们需要添加用户,那在linux系统里通常可以使用 useradd 命令来添加用户。
sudo useradd $username
执行这个命令之前,新用户的用户名我们还是需要用read命令来读取用户的输入
read -p "Enter username: " username
最后再增加打印语句来提示我们添加用户已经完成
echo "User $username has been added."
此时添加用户时该这样填充:
?1)
????# 添加用户
????read -p "Enter username: " username
????sudo useradd $username
????echo "User $username has been added."
;;
其他功能模块其实同理:
当用户选择2时,我们需要删除用户,在 Linux 系统中,可以使用 userdel 命令来删除用户。
sudo userdel $username
执行这个命令之前,删除哪个用户也需要用read命令来读取用户的输入
?read -p "Enter username: " username
最后再增加打印语句来提示完成
?echo "User $username has been deleted."
此时删除用户时该这样填充:
?2)
????# 删除用户
????read -p "Enter username: " username
????sudo userdel $username
????echo "User $username has been deleted."
;;
当用户选择3时,我们需要修改用户密码,在 Linux 系统中,可以使用passwd 命令来修改用户的密码
sudo passwd $username
执行这个命令之前,修改用户密码也需要用read命令来读取用户的输入
read -p "Enter username: " username
最后再增加打印语句来提示完成
?3)
????# 修改用户密码
????read -p "Enter username: " username
????sudo passwd $username
????echo "Password for user $username has been changed."
;;
当用户选择4时,我们需要列出所有用户,在 Linux 系统中,可以使用以下命令来列出所有用户:
cat /etc/passwd | cut -d: -f1
该命令将打印 /etc/passwd 文件,并使用 cut 命令从每行中提取第一个字段,即用户名。这将列出在系统上注册的所有用户。
?# 列出所有用户
????cat /etc/passwd | cut -d: -f1
;;
新建一个脚本叫user.sh,并且将其设置为可执行文件,内容如下:
执行后,可以试试功能,比如添加用户。
这时可见已经添加成功了。