Kiểm tra file tồn tại trong Bash
Trong hầu hết các trường hợp, chúng ta có thể gặp tình huống cần thực hiện một hành động để kiểm tra xem một file có tồn tại hay không.
Trong Bash, chúng ta có thể sử dụng một ‘lệnh kiểm tra’ để kiểm tra xem một file có tồn tại và xác định loại của file.
Sau đây là cú pháp của lệnh kiểm tra, và chúng ta có thể sử dụng bất kỳ lệnh nào trong các lệnh này:
test expression
[ expression ]
[[ expression ]]
Chúng ta cần sử dụng lệnh ngoặc đơn ‘[‘ để làm cho tập lệnh của mình có thể sử dụng được trên tất cả các shell POSIX. Phiên bản nâng cấp của lệnh kiểm tra chứa đôi ngoặc vuông ‘[[‘ được hỗ trợ trên hầu hết các hệ thống hiện đại sử dụng Bash, Zsh và Ksh như là một shell mặc định.
Kiểm tra xem Tệp tồn tại hay không
Trong khi kiểm tra xem một file có tồn tại hay không, các toán tử file được sử dụng phổ biến nhất là -e và -f. Tùy chọn ‘-e’ được sử dụng để kiểm tra xem một file có tồn tại hay không bất kể loại, trong khi tùy chọn ‘-f’ được sử dụng để trả về giá trị true chỉ nếu file là một file thông thường (không phải là một thư mục hoặc thiết bị).
Tùy chọn phổ biến nhất để kiểm tra xem file có tồn tại hay không là sử dụng lệnh kiểm tra với ‘lệnh điều kiện if’.
Sau đây là các ví dụ để kiểm tra xem file ‘read_file.txt’ có tồn tại hay không:”
Phương pháp 1
#!/bin/bash
File=read_file.txt
if test -f "$File"; then
echo "$File exist "
fi
Phương pháp 2
#!/bin/bash
File=read_file.txt
if [ -f "$File" ]; then
echo "$File exist "
fi
Phương pháp 3
#!/bin/bash
File=read_file.txt
if [[ -f "$File" ]]; then
echo "$File exist "
fi
Kết quả cho tất cả ba phương pháp sẽ như sau vì chúng ta có một file (read_file.txt) có trong thư mục:
read_file.txt exist
Nếu chúng ta muốn thực hiện một hành động cung cấp kết quả dựa trên việc file tồn tại hay không, chúng ta có thể sử dụng cấu trúc if/then như sau:
#!/bin/bash
File=read_file.txt
if [ -f "$File" ]; then
echo "$File exist"
else
echo "$File does not exist"
fi
Kết quả
read_file.txt exist
Chúng ta cũng có thể sử dụng lệnh test mà không cần sử dụng câu lệnh if. Chúng ta có thể sử dụng bất kỳ một trong các phương pháp sau đây:
Phương pháp 1
#!/bin/bash
File=read_file.txt
test -f read_file.txt && echo "$File exist"
Phương pháp 2
#!/bin/bash
File=read_file.txt
[ -f read_file.txt ] && echo "$File exist"
Phương pháp 3
#!/bin/bash
File=read_file.txt
[[ -f read_file.txt ]] && echo "$File exist"
Kết quả cho tất cả ba phương pháp sẽ giống nhau như sau vì chúng ta có một file (read_file.txt) có trong thư mục:
read_file.txt exist
Nếu có nhiều lệnh cần chạy sau toán tử &&, thì hãy bao lệnh trong ngoặc nhọn và ngăn cách bằng dấu chấm phẩy (;) hoặc AND (&&), ví dụ:
#!/bin/bash
File=read_file.txt
[ -f read_file.txt ] && { echo "$File exist"; echo "Task Completed"; }
Khác với &&, câu lệnh sau toán tử || chỉ được thực thi khi trạng thái thoát của lệnh kiểm tra là ‘false’.
#!/bin/bash
File=read_file.txt
[ -f read_file.txt ] && echo "$File exist" || echo "$File does not exist"
Kết quả
read_file.txt exist
Đây là những phương pháp thông thường được sử dụng trong Bash để kiểm tra xem file có tồn tại hay không.
Kiểm tra xem thư mục có tồn tại hay không Toán tử ‘-d’ cho phép chúng ta kiểm tra xem một file có phải là thư mục hay không.
Dưới đây là các phương pháp để kiểm tra xem thư mục ‘Javatpoint’ có tồn tại hay không:
Phương án 1
#!/bin/bash
File=Javatpoint
if [ -d "$File" ]; then
echo "$File is a directory"
fi
Phương án 2
#!/bin/bash
File=Javatpoint
[ -d "$File" ] && echo "$File is a directory"
Chú ý: Chúng ta cũng có thể sử dụng hai dấu ngoặc vuông ‘[[‘ thay vì một dấu ngoặc vuông ‘[‘. Đầu ra
Kết quả đối với cả hai phương pháp trên sẽ như dưới đây vì chúng ta có một thư mục (tên là Javatpoint) có trong vị trí chỉ định:
Javatpoint is a directory
Kiểm tra nếu file không tồn tại
Biểu thức kiểm tra có thể được phủ định bằng cách sử dụng dấu chấm than (! – toán tử NOT logic). Xem ví dụ dưới đây:
#!/bin/bash
File=missing_read_file.txt
if [ ! -f "$File" ]; then
echo "$File does not exist"
fi
Kịch bản trên cũng có thể được viết như bên dưới:
#!/bin/bash
File=missing_read_file.txt
[ ! -f "$File" ] && echo "$File unavailable"
Kết quả
missing_read_file.txt unavailable
Các toán tử kiểm tra tập tin
Các lệnh kiểm tra bao gồm các Toán tử Tệp tin sau đây cho phép chúng ta kiểm tra cho các loại file cụ thể:
Toán tử | Mô tả |
---|---|
-b file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một file đặc biệt dạng khối (block special file). |
-c file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một file đặc biệt dạng ký tự (character special file). |
-d file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một thư mục (directory). |
-e file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại, bất kể loại file (node, directory, socket, vv.). |
-f file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một file thường (regular file) (không phải là một thư mục hoặc thiết bị). |
-G file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và cùng nhóm với người dùng đang chạy lệnh. |
-h file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một liên kết tượng trưng (symbolic link). |
-g file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và có cờ set-group-id (sgid) được đặt. |
-k file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và có cờ sticky bit được đặt. |
-L file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một liên kết tượng trưng (symbolic link). |
-O file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và được sở hữu bởi người dùng đang chạy lệnh. |
-p file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một ống (pipe). |
-r file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và có thể đọc được. |
-S file | Trả về giá trị ‘Đúng’ (True) nếu file tồn tại và là một socket. |
-s File | Trả về giá trị ‘Đúng’ (“True”) nếu FILE tồn tại và có kích thước khác 0. |
-u File | Trả về giá trị ‘Đúng’ (“True”) nếu FILE tồn tại và có cờ set-user-id (suid) được đặt. |
-w File | Trả về giá trị ‘Đúng’ (“True”) nếu FILE tồn tại và có thể ghi được. |
-x File | Trả về giá trị ‘Đúng’ (“True”) nếu FILE tồn tại và có thể thực thi được. |