如何在 Linux 上使用 Bash 自动化任务
创始人
2024-03-02 12:14:29
0

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

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

自动执行文件任务:for

如果你对一堆文件要同时处理,并且对每个文件进行相同的操作,请使用 for 命令。该命令会遍历文件列表,并执行一个或多个命令。for 命令如下所示:

for 变量 in 列表
do
    命令
done

我在示例中添加了额外的空白和换行,来分开 for 命令中不同的部分。看起来好像无法在命令行中同时运行多个命令,不过你可以使用 ; 将所有命令放在同一行中,就像这样:

for 变量 in 列表 ; do 命令 ; done

让我们看看它的实际效果。我使用 for 命令来重命名一些文件。最近,我有一些截图,想要重命名。这些截图名称为 filemgr.pngterminal.png,我想将 screenshot 放在每个名称前。我可以使用 for 命令一次性将 30 个文件重命名。这是两个文件的示例:

$ ls
filemgr.png  terminal.png
$ for f in *.png ; do mv $f screenshot-$f ; done
$ ls
screenshot-filemgr.png  screenshot-terminal.png

for 命令使得在一系列文件中执行一种或多种操作变得容易。你可以用一些有意义的变量名,比如 imagescreenshot,或者你用示例中“缩写的”变量 f。当我在使用 for 循环写脚本的时候,会选择有意义的变量名。但是当我在命令行中使用 for,我通常会选择缩写变量名,比如 f 代表文件,d 代表目录等。

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

按条件执行:if

当你需要对每个文件执行相同操作时,使用 for 循环遍历一些文件很有帮助。但是,如果你需要对某些文件做一些不同的事情怎么办?为此,你需要使用 if 语句进行条件执行。if 语句如下所示:

if 测试
then
    命令
fi

你也可以使用 ifelse 语句进行判断:

if 测试
then
    命令
else
    命令
fi

你可以使用 ifelifelse 语句来实现更复杂的程序。当我一次性需要自动处理很多文件时,我会在脚本中使用:

if 测试1
then
    命令
elif 测试2
then
    命令
elif 测试3
then
    命令
else
    命令
fi

if 命令可以让你进行各种判断,例如判断一个文件是否是一个文件,或者一个文件是否为空文件(零字节)。在命令行中输入 help test,可以立即查看使用 if 语句能够进行的各种测试。

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

让我们用一个示例来看看这个过程。我创建了两个测试文件:一个是空的,另一个包含一些数据。我们可以使用 if 判断,如果文件为空打印消息 empty

$ ls
datafile  emptyfile
$ if [ ! -s datafile ] ; then echo "empty" ; fi
$ if [ ! -s emptyfile ] ; then echo "empty" ; fi
empty

我们可以将 iffor 命令结合起来,检查日志文件列表中的空文件并删除:

$ ls -l
total 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 ; done
removed 'log.4'
removed 'log.6'
$ ls -l
total 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中国 荣誉推出

相关内容

Red Hat 加强与电信...
随着开放式无线接入网络 (Open RAN) 和相关的人工智能 R...
2025-03-04 06:50:52
在Linux服务器上绑定域...
要把Linux服务器和域名绑定起来,让我们先简单聊聊这个过程。想象...
2025-02-27 13:49:16
​京软AI营销平台:AI技...
在当今竞争激烈的市场环境中,企业需要更加高效、精准的营销手段来保持...
2025-02-25 11:21:00
董明珠:格力自主研发工业机...
2月5日,广东“新春第一会”隆重举行。珠海格力电器股份有限公司董事...
2025-02-07 06:16:36
不知道在soup.sele...
在使用Python自动化处理无聊的事情时,如果要使用Beautif...
2025-01-12 11:01:34
不知道该如何处理这个bas...
要解决这个问题,可以尝试以下几个步骤:仔细检查代码:阅读代码并确保...
2025-01-12 01:32:07

热门资讯

使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
Bazzite:专为 Stea... 为 Linux 桌面或者 Steam Deck 做好游戏准备,听起来都很刺激!对于一个专为 Linu...
Motrix:一个漂亮的跨平台... 一个开源的下载管理器,提供了一个简洁的用户界面,同时提供了跨平台操作的所有基本功能。在这里了解关于它...
Bash 脚本中如何使用 he... here 文档 here document (LCTT 译注:here 文档又称作 heredoc ...
使用 dialog 和 jq ... 为何选择文字用户界面(TUI)?许多人每日都在使用终端,因此, 文字用户界面 Text User I...