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

121 阅读4分钟

Bash命令行是实现任务自动化的一个好方法。无论你是在服务器上运行Linux,需要操作日志文件或其他数据,还是你是一个只想保持文件整洁的桌面用户,你都可以使用Bash中的一些自动化功能来使你的工作更容易。

Linux的命令。在文件上实现任务自动化

如果你有一堆文件要同时处理,而且你需要对每个文件做同样的事情,可以使用for 命令。这个命令在一个文件列表中进行迭代,并执行一个或多个命令。for 命令看起来像这样。

for variable in list
do
    commands
done

我在这里添加了一些额外的间距,以帮助分隔for 命令的不同部分。这个多行命令可能看起来很难在命令行上运行,但你可以使用; ,把所有内容放在一行,像这样。

for variable in list ; do commands ; 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 命令的信息。

Linux条件执行(if)

当你需要对每个文件做同样的事情时,用for 循环处理一组文件很有帮助。但是如果你需要对某些文件做一些不同的事情呢?为此,你需要用if 语句进行条件执行。if 语句看起来像这样。

你也可以通过使用else 关键字做if/else测试。

if test
then
    commands
else
    commands
fi

对于更复杂的处理,你可以使用if/else-if/else的评价。我可能会在一个脚本中使用这个方法,当我需要自动处理一个文件集合的时候。

if test
then
    commands
elif test2
then
    commands
elif test3
then
    commands
else
    commands
fi

if 命令允许你进行许多不同的测试,例如,一个文件是否真的是一个文件,或者一个文件是否是空的(零大小)。在Bash提示符下输入help test ,可以看到在if 语句中可以使用不同种类的测试。

例如,假设我想清理一个有几十个文件的日志目录。日志管理的一个常见任务是删除任何空的日志,并压缩其他的日志。解决这个问题的最简单方法是直接删除空文件。没有一个if 测试与之完全匹配,但我们有-s 文件来测试某物是否是一个文件,以及该文件是否为空(它有一个大小)。这与我们想要的正好相反,但我们可以用! 来否定这个测试,看看某个东西是不是文件或是否为空。

让我们看一个例子,看看这个例子的作用。我已经创建了两个测试文件:一个是空的,另一个包含一些数据。如果文件是空的,我们可以使用if 来打印 "空 "的信息。

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

我们可以把它和for结合起来,检查一个日志文件的列表,为我们删除空文件。

$ 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 ,可以使我的脚本根据需要采取不同的行动。