如何在 Linux 上使用 Bash 自動(dòng)化任務(wù)
通過(guò) Bash 命令行進(jìn)行自動(dòng)化任務(wù)是極好的一種方式。不論你使用運(yùn)行在服務(wù)器上的 Linux 進(jìn)行管理日志文件或其他文件,還是你在個(gè)人電腦上整理文件以使桌面保持整潔,使用 Bash 的自動(dòng)化功能會(huì)使你的工作變得更輕松。
自動(dòng)執(zhí)行文件任務(wù):for
如果你對(duì)一堆文件要同時(shí)處理,并且對(duì)每個(gè)文件進(jìn)行相同的操作,請(qǐng)使用 for? 命令。該命令會(huì)遍歷文件列表,并執(zhí)行一個(gè)或多個(gè)命令。for 命令如下所示:
for 變量 in 列表
do
命令
done
我在示例中添加了額外的空白和換行,來(lái)分開 for? 命令中不同的部分??雌饋?lái)好像無(wú)法在命令行中同時(shí)運(yùn)行多個(gè)命令,不過(guò)你可以使用 ; 將所有命令放在同一行中,就像這樣:
for 變量 in 列表 ; do 命令 ; done
讓我們看看它的實(shí)際效果。我使用 for? 命令來(lái)重命名一些文件。最近,我有一些截圖,想要重命名。這些截圖名稱為 filemgr.png? 或 terminal.png?,我想將 screenshot? 放在每個(gè)名稱前。我可以使用 for 命令一次性將 30 個(gè)文件重命名。這是兩個(gè)文件的示例:
$ ls
filemgr.png terminal.png
$ for f in *.png ; do mv $f screenshot-$f ; done
$ ls
screenshot-filemgr.png screenshot-terminal.png
for? 命令使得在一系列文件中執(zhí)行一種或多種操作變得容易。你可以用一些有意義的變量名,比如 image? 或 screenshot?,或者你用示例中“縮寫的”變量 f?。當(dāng)我在使用 for? 循環(huán)寫腳本的時(shí)候,會(huì)選擇有意義的變量名。但是當(dāng)我在命令行中使用 for?,我通常會(huì)選擇縮寫變量名,比如 f? 代表文件,d 代表目錄等。
不論你選擇怎樣的變量名,請(qǐng)確保在引用變量時(shí)添加 $? 符號(hào)。這會(huì)將變量擴(kuò)展為你正在處理的文件的名稱。在 Bash 提示符下鍵入 help for? 以了解有關(guān) for 命令的更多信息。
按條件執(zhí)行:if
當(dāng)你需要對(duì)每個(gè)文件執(zhí)行相同操作時(shí),使用 for? 循環(huán)遍歷一些文件很有幫助。但是,如果你需要對(duì)某些文件做一些不同的事情怎么辦?為此,你需要使用 if? 語(yǔ)句進(jìn)行條件執(zhí)行。if 語(yǔ)句如下所示:
if 測(cè)試
then
命令
fi
你也可以使用 if、else 語(yǔ)句進(jìn)行判斷:
if 測(cè)試
then
命令
else
命令
fi
你可以使用 if、elif、else 語(yǔ)句來(lái)實(shí)現(xiàn)更復(fù)雜的程序。當(dāng)我一次性需要自動(dòng)處理很多文件時(shí),我會(huì)在腳本中使用:
if 測(cè)試1
then
命令
elif 測(cè)試2
then
命令
elif 測(cè)試3
then
命令
else
命令
fi
if? 命令可以讓你進(jìn)行各種判斷,例如判斷一個(gè)文件是否是一個(gè)文件,或者一個(gè)文件是否為空文件(零字節(jié))。在命令行中輸入 help test?,可以立即查看使用 if 語(yǔ)句能夠進(jìn)行的各種測(cè)試。
例如,假設(shè)我想清理一個(gè)包含幾十個(gè)文件的日志目錄。日志管理中的一個(gè)常見任務(wù)是刪除所有空日志文件,并壓縮其他日志。解決這個(gè)問(wèn)題的最簡(jiǎn)單方法是刪除空文件。沒有可以完全匹配的 if? 測(cè)試,但是我們有 -s? 選項(xiàng)來(lái)判斷是否是一個(gè)文件,并且判斷該文件不是空的(大小不為零)。這與我們想要的相反,但我們可以使用 ! 來(lái)否定測(cè)試,以判斷某些內(nèi)容不是文件或?yàn)榭铡?/p>
讓我們用一個(gè)示例來(lái)看看這個(gè)過(guò)程。我創(chuàng)建了兩個(gè)測(cè)試文件:一個(gè)是空的,另一個(gè)包含一些數(shù)據(jù)。我們可以使用 if? 判斷,如果文件為空打印消息 empty:
$ ls
datafile emptyfile
$ if [ ! -s datafile ] ; then echo "empty" ; fi
$ if [ ! -s emptyfile ] ; then echo "empty" ; fi
empty
我們可以將 if? 和 for 命令結(jié)合起來(lái),檢查日志文件列表中的空文件并刪除:
$ 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? 命令可以在需要時(shí)執(zhí)行一些操作,使腳本變得智能。我經(jīng)常會(huì)在腳本中使用 if?,當(dāng)我需要判斷文件在我的系統(tǒng)上存在或不存在時(shí),或者判斷腳本正在檢查的條目是文件或目錄時(shí)。使用 if 使得腳本能夠根據(jù)需要采取不同的操作。