Bash 非常靈活,並提供了各種選項來測試文件。如果你正在尋找一種測試文件的方法,Bash 文件測試運算子將會幫助你。
在本教程中,你將學習不同的文件測試運算子以及如何使用它們來測試文件是否存在、可讀取、是否為空等等。
繼續閱讀並熟悉 Bash 文件測試運算子!
先決條件
本教程將進行實際演示。如果你想跟隨操作,請確保你具備以下內容:
- A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.
大多數 Linux 發行版預設安裝了 Bash。但如果你使用的是 Windows,你可以安裝 Windows 子系統 Linux (WSL) 來獲得 Bash shell。
- A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.
- 本教程假設你能夠使用 SSH 連接到 Linux 系統。
什麼是Bash文件測試運算符?
在深入研究測試運算符之前,先了解它們的工作原理。文件測試運算符允許您測試文件的各個方面,如文件是否存在,是否可讀/可寫等。
使用文件測試運算符可以幫助防止Bash腳本中的錯誤。下面的代碼是if語句的樣板。if-else語句是您在Bash腳本中經常看到的一個強大工具。
請注意,代碼塊的then和else部分是可選的。您可以在不使用它們的情況下使用if語句。
檢查文件是否存在
你已經看到了測試運算子的工作方式的一瞥,但這還不足以更好地理解它們的各個方面。所以,從一個基本示例開始,比如檢查文件是否存在。
在現實世界中,您可能希望在創建配置文件之前檢查配置文件是否存在。您不希望浪費時間從頭開始建立配置文件,只是發現已經存在相同的文件。
要檢查文件是否已存在:
1. 打開您的終端,運行以下命令touch來創建一個新的 test.txt 文件。這個命令不會提供輸出,但您將在下一步驗證文件是否存在。
2. 接下來,運行以下 ls 命令來列出您工作目錄中新創建的文件(test.txt)。
下面的輸出確認您已成功創建了 test.txt 文件。
現在您有了一個測試文件,您可以在接下來的步驟中使用 Bash 腳本中的標準代碼塊來檢查文件是否存在。

3. 運行下面的命令來創建(touch)並打開一個新的 shell 腳本文件(if_file_exists.sh),在您喜歡的文本編輯器(nano)中。
4. 現在,將下面的代碼填入您的新的 if_file_exists.sh 文件中,保存文件並關閉編輯器。
- 執行if-else語句來測試指定的文件是否存在。
- 如果運算符返回true,您將收到一條說明文件存在的消息。
- 如果運算符返回true,您將收到一條說明文件不存在的消息。但是這次,文件將自動創建,使用您在FILE變量中定義的名稱。
文件頂部的#!/bin/bash行被稱為shebang。shebang告訴系統使用哪個解釋器運行腳本,此處為Bash。如果不包括shebang,系統將使用默認的解釋器,這可能不是Bash。缺少shebang可能導致腳本失敗。
5. 運行以下命令以執行你的新腳本(if_file_exists.sh)
如果一切順利,你會在終端上看到打印出test.txt存在的消息,如下所示。

6. 接下來,運行以下命令來刪除(rm -rf)測試文件(test.txt),並列出你的工作目錄中的所有文件。
下面,你可以驗證test.txt不再列出。

7. 重新運行下面的命令以執行你的if_file_exists.sh腳本。
由於test.txt文件不再存在,當-e運算符返回false時,該腳本將創建一個新的test.txt文件。

8. 最後,運行下面的ls命令以列出你的工作目錄中的test.txt文件。
下面的輸出確認了你的腳本創建了一個新的test.txt文件。

檢查文件是否為常規文件還是特殊文件
在打開或處理文件之前,你可能希望首先檢查該文件是否為常規文件還是特殊文件。為什麼呢?特殊文件是存儲在文件系統中的一種文件類型,因此要小心不要搞亂這些文件。
例如,打開特殊文件時的一個常見錯誤是“沒有該文件或目錄”錯誤。當你試圖打開的文件不存在時,會發生這種錯誤。但在打開常規文件而不是特殊文件時,同樣的錯誤也可能發生。
在你的文本編輯器中打開一個新的special_file.sh文件,添加以下代碼並保存更改。
以下的程式碼類似於先前的程式碼。但這段程式碼使用了-f
操作符而非-e
操作符。
現在,運行下面的命令來執行您的special_file.sh
腳本。
由於/dev/vmmon中指定的檔案在FILE
變量中是一個特殊檔案,您將收到下面的消息。

檢查目錄是否存在
到目前為止,您已經了解了如何檢查檔案是否存在。但是同樣的方法適用於目錄嗎?是的,通過使用-d
測試操作符。如果您計劃根據目錄是否存在來採取行動,則此操作符非常有用。
也許您想將一個目錄中的所有檔案複製到另一個目錄中。如果目標目錄不存在,您可以在複製檔案之前創建它。
1. 執行以下 ls 指令以列出工作目錄中的 example-dir。
您將收到一條訊息,說明找不到該目錄,因為該目錄不存在。如果您不想因為目錄不存在而中斷流程,請跳到下一步。

2. 接下來,在您的文本編輯器中打開一個新文件,名為 if_dir_exists.sh,添加以下代碼並保存文件。以下代碼測試指定目錄是否存在,並根據 -d 運算子返回的值執行任務。
您可以通過使用否定運算子(!)來交換 if 和 else 語句,以達到相同的結果。在現實情況下,! 運算子可以幫助編寫更清潔、更簡潔的腳本。
3. 現在,執行以下命令來執行您的腳本(if_dir_exists.sh)。
您可以看到消息,显示目录已创建,并且test.txt文件已复制,因为example_dir不存在。

4. 最后,在example_dir 目录下运行ls命令,确认目录存在并包含test.txt文件。

检查文件是否为空
您已经知道如何使用三个最常用的文件测试运算符(-e,-f和-d)来提升脚本技能。但还有其他运算符值得一看。
通常,您不会高亮显示文件的内容以复制到另一个文件,而是运行一个命令来为您完成工作。但请稍等,因为您的目标文件可能不为空。
为什么不使用-s运算符来检查文件是否存在且不为空呢?该运算符如果文件存在且大小大于零,则返回true。
1. 在文本编辑器中打开一个名为empty_file.sh的新文件,添加以下代码,并保存文件。
以下代码测试指定的文件是否为空,并根据-s运算符返回的值打印消息。
2. 現在,運行以下命令來執行您的腳本(empty_file.sh)。
下面,您可以看到一條消息,指出 test.txt 要麼不存在要麼是空的。但是同時,腳本向 test.txt 文件添加了文本。

3. 運行下面的 cat 命令來驗證 test.txt 文件是否包含添加的文本。

4. 最後,重新運行下面的 bash 命令來執行 empty_file.sh 腳本。
下面,您可以看到輸出已更改為 test.txt 存在並且不是空的,因為 test.txt 文件現在包含一些文本並且大小大於零(0)。

檢查文件是否存在並且可讀
也許您的自動化涉及讀取文件以執行任務。這些任務的成功將取決於文件是否可讀。編寫一個腳本來檢查文件是否存在並且可讀將成為一個方便的解決方案。
要演示檢查文件是否存在且可讀:
1. 執行以下命令以登錄到另一個用戶帳戶(ata)。
您的提示符($)會變成顯示您已經作為其他用戶登錄。

或者,您可以使用chmod命令將文件的權限更改為可讀、可寫或兩者兼具。
2. 登錄後,使用您的文本編輯器創建一個名為readable_file.sh的新文件
將以下代碼添加到readable_file.sh文件中,並保存更改。此代碼檢查位於/root目錄中的名為test.txt的文件是否存在且可讀。
3. 現在,運行以下命令以執行readable_file.sh腳本。
這次,您將看到一條消息,指出 /root/test.txt 不存在或不可讀。由於 text.test 文件位於 /root 目錄中,當前用戶 (ata) 對 text.txt 文件沒有讀取權限。

4. 最後,運行以下命令執行以下操作:
- 更改 sudoers 文件以允許當前用戶 (ata) 使用
sudo
執行提升權限的命令。
- 執行 readable_file.sh 腳本,測試特定文件是否可讀取。
您可以看到下面的輸出打印出 test.txt 存在且可讀取,因為 ata 用戶現在對 test.txt 文件具有讀取權限。

結論
A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.
憑藉這些新發現的技能,您可以自信地根據測試結果決定採取哪些行動。但是,您可以使用許多其他方法來使用 Bash 文件測試運算符。
為什麼不試著檢查文件的 擴展名?或者也許 檢查多個文件是否存在,看看您需要的所有文件是否都可用?