| 会员登录 立即注册

打印 上一主题 下一主题

如何在 Linux 上使用 Bash 自动化任务

[复制链接]
跳转到指定楼层
楼主
3AAA 发表于 2022-9-2 12:14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主
3AAA
2022-9-2 12:14:08 3552 2 看楼主


Bash 有一些方便的自动化功能,可以让我在 Linux 上处理文件时更轻松。

通过 Bash 命令行进行自动化任务是极好的一种方式。不论你使用运行在服务器上的 Linux 进行管理日志文件或其他文件,还是你在个人电脑上整理文件以使桌面保持整洁,使用 Bash 的自动化功能会使你的工作变得更轻松。

自动执行文件任务:for


如果你对一堆文件要同时处理,并且对每个文件进行相同的操作,请使用 for命令。该命令会遍历文件列表,并执行一个或多个命令。for命令如下所示:
for 变量 in 列表do    命令done
我在示例中添加了额外的空白和换行,来分开 for命令中不同的部分。看起来好像无法在命令行中同时运行多个命令,不过你可以使用;将所有命令放在同一行中,就像这样:
for 变量 in 列表 ; do 命令 ; done
让我们看看它的实际效果。我使用 for命令来重命名一些文件。最近,我有一些截图,想要重命名。这些截图名称为filemgr.png或terminal.png,我想将screenshot放在每个名称前。我可以使用for命令一次性将 30 个文件重命名。这是两个文件的示例:
$ lsfilemgr.png  terminal.png$ for f in *.png ; do mv $f screenshot-$f ; done$ lsscreenshot-filemgr.png  screenshot-terminal.png
for命令使得在一系列文件中执行一种或多种操作变得容易。你可以用一些有意义的变量名,比如image或screenshot,或者你用示例中“缩写的”变量f。当我在使用for循环写脚本的时候,会选择有意义的变量名。但是当我在命令行中使用for,我通常会选择缩写变量名,比如f代表文件,d代表目录等。

不论你选择怎样的变量名,请确保在引用变量时添加 $符号。这会将变量扩展为你正在处理的文件的名称。在 Bash 提示符下键入help for以了解有关for命令的更多信息。

按条件执行:if


当你需要对每个文件执行相同操作时,使用 for循环遍历一些文件很有帮助。但是,如果你需要对某些文件做一些不同的事情怎么办?为此,你需要使用if语句进行条件执行。if语句如下所示:
if 测试then    命令fi
你也可以使用 if、else语句进行判断:
if 测试then    命令else    命令fi
你可以使用 if、elif、else语句来实现更复杂的程序。当我一次性需要自动处理很多文件时,我会在脚本中使用:
if 测试1then    命令elif 测试2then    命令elif 测试3then    命令else    命令fi
if命令可以让你进行各种判断,例如判断一个文件是否是一个文件,或者一个文件是否为空文件(零字节)。在命令行中输入help test,可以立即查看使用if语句能够进行的各种测试。

例如,假设我想清理一个包含几十个文件的日志目录。日志管理中的一个常见任务是删除所有空日志文件,并压缩其他日志。解决这个问题的最简单方法是删除空文件。没有可以完全匹配的 if测试,但是我们有-s选项来判断是否是一个文件,并且判断该文件不是空的(大小不为零)。这与我们想要的相反,但我们可以使用!来否定测试,以判断某些内容不是文件或为空。

让我们用一个示例来看看这个过程。我创建了两个测试文件:一个是空的,另一个包含一些数据。我们可以使用 if判断,如果文件为空打印消息empty:
$ lsdatafile  emptyfile$ if [ ! -s datafile ] ; then echo "empty" ; fi$ if [ ! -s emptyfile ] ; then echo "empty" ; fiempty
我们可以将 if和for命令结合起来,检查日志文件列表中的空文件并删除:
$ ls -ltotal 20-rw-rw-r--. 1 jhall jhall 2 Jul  1 01:02 log.1-rw-rw-r--. 1 jhall jhall 2 Jul  2 01:02 log.2-rw-rw-r--. 1 jhall jhall 2 Jul  3 01:02 log.3-rw-rw-r--. 1 jhall jhall 0 Jul  4 01:02 log.4-rw-rw-r--. 1 jhall jhall 2 Jul  5 01:02 log.5-rw-rw-r--. 1 jhall jhall 0 Jul  6 01:02 log.6-rw-rw-r--. 1 jhall jhall 2 Jul  7 01:02 log.7$ for f in log.* ; do if [ ! -s $f ] ; then rm -v $f ; fi ; doneremoved 'log.4'removed 'log.6'$ ls -ltotal 20-rw-rw-r--. 1 jhall jhall 2 Jul  1 01:02 log.1-rw-rw-r--. 1 jhall jhall 2 Jul  2 01:02 log.2-rw-rw-r--. 1 jhall jhall 2 Jul  3 01:02 log.3-rw-rw-r--. 1 jhall jhall 2 Jul  5 01:02 log.5-rw-rw-r--. 1 jhall jhall 2 Jul  7 01:02 log.7
使用 if命令可以在需要时执行一些操作,使脚本变得智能。我经常会在脚本中使用if,当我需要判断文件在我的系统上存在或不存在时,或者判断脚本正在检查的条目是文件或目录时。使用if使得脚本能够根据需要采取不同的操作。

via: https://opensource.com/article/22/7/use-bash-automate-tasks-linux

作者:Jim Hall选题:lkxed译者:Donkey-Hao校对:wxy

本文由 LCTT原创编译,Linux中国荣誉推出
回复

使用道具 举报

沙发
iceman008 发表于 2022-9-2 12:15:39 | 只看该作者
沙发
iceman008
2022-9-2 12:15:39 看楼主
转发了
回复 支持 反对

使用道具 举报

板凳
小女子来了CC 发表于 2022-9-2 12:16:36 | 只看该作者
转发了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

3AAA 当前离线
白银会员

查看:3552 | 回复:2

关于我们  |   侵权投诉受理  |   联系我们  |   Archiver  |  
免责声明:邳州信息网所有言论只代表发表者个人观点,与本站无关
Copyright © 2009-2025 pzxxw.com 版权所有:邳州金银杏文化传媒有限公司  

苏公网安备 32038202000401号

快速回复 返回顶部 返回列表