Linux中國

如何在 Linux 上使用 Bash 自動化任務

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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...
    Linux中國

    SSL/TLS 加密新紀元 – Lets Encrypt

    根據 Let's Encrypt 官方博客消息,Let's Encrypt 服務將在下周(11 月 16 日)正式對外開放。 Let's Encrypt 項目是由互聯網安全研究小組(ISRG,Internet Security Research Group)主導並開發的一個新型數字證書認證機構(CA,Certificate ...