Nhiều khi viết kịch bản Shell, bạn có thể rơi vào tình huống cần thực hiện một hành động dựa trên việc một tệp có tồn tại hay không.
Trong Bash, bạn có thể sử dụng lệnh kiểm tra để kiểm tra xem tệp có tồn tại hay không và xác định loại tệp.
Lệnh kiểm tra có một trong các dạng cú pháp sau:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
Nếu bạn muốn tập lệnh của mình có tính di động, bạn nên sử dụng [lệnh kiểm tra cũ , có sẵn trên tất cả các trình bao POSIX. Phiên bản nâng cấp mới của lệnh kiểm tra [[ (dấu ngoặc kép) được hỗ trợ trên hầu hết các hệ thống hiện đại sử dụng Bash, Zsh và Ksh làm trình bao mặc định.
Kiểm tra xem tệp có tồn tại không
Khi kiểm tra xem tệp 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. Cái đầu tiên sẽ kiểm tra xem một tệp có tồn tại bất kể loại hay không, trong khi cái thứ hai sẽ chỉ trả về true nếu FILE là một tệp thông thường (không phải là một thư mục hoặc một thiết bị).
Tùy chọn dễ đọc nhất khi kiểm tra xem tệp có tồn tại hay không là sử dụng lệnh test kết hợp với if . Bất kỳ đoạn mã nào bên dưới sẽ kiểm tra xem /etc/resolv.conf có tồn tại hay không:
FILE=/etc/resolv.conf
if test -f "$FILE"; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
echo "$FILE exists."
fi
Nếu bạn muốn thực hiện một hành động khác dựa trên việc tệp có tồn tại hay không, chỉ cần sử dụng cấu trúc if / then:
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
echo "$FILE does not exist."
fi
Sao chépLuôn sử dụng dấu ngoặc kép để tránh các vấn đề khi xử lý các tệp chứa khoảng trắng trong tên của chúng.
Bạn cũng có thể sử dụng lệnh kiểm tra mà không có lệnh if. Lệnh sau &&toán tử sẽ chỉ được thực hiện nếu trạng thái thoát của lệnh kiểm tra là đúng,
test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."
Nếu bạn muốn chạy một loạt lệnh sau toán tử &&, chỉ cần đặt các lệnh trong dấu ngoặc nhọn được phân tách bằng ; hoặc &&:
[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }
Ngược lại &&, câu lệnh sau toán tử || sẽ chỉ được thực hiện nếu trạng thái thoát của lệnh kiểm tra là false.
[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."
Kiểm tra xem Thư mục có tồn tại không
Các toán tử -d cho phép bạn kiểm tra xem một tệp có phải là một thư mục hay không.
Ví dụ để kiểm tra xem thư mục /etc/docker có tồn tại hay không, bạn sẽ sử dụng:
FILE=/etc/docker
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."
Bạn cũng có thể sử dụng dấu ngoặc kép [[ thay vì dấu ngoặc đơn [.
Kiểm tra xem tệp không tồn tại
Tương tự như nhiều ngôn ngữ khác, biểu thức kiểm tra có thể bị phủ định bằng cách sử dụng toán tử ! logic not (dấu chấm than):
FILE=/etc/docker
if [ ! -f "$FILE" ]; then
echo "$FILE does not exist."
fi
Giống như trên:
[ ! -f /etc/docker ] && echo "$FILE does not exist."
Kiểm tra xem có nhiều tệp tồn tại không
Thay vì sử dụng các cấu trúc if / else lồng nhau phức tạp, bạn có thể sử dụng -a ( hoặc && với [[ ) để kiểm tra xem có nhiều tệp tồn tại hay không:
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
echo "Both files exist."
fi
Các biến thể tương đương mà không sử dụng câu lệnh IF:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
Toán tử kiểm tra tệp
Lệnh kiểm tra bao gồm các toán tử FILE sau đây cho phép bạn kiểm tra các loại tệp cụ thể:
-bFILE– Đúng nếu FILE tồn tại và là một tệp khối đặc biệt.-cFILE– Đúng nếu FILE tồn tại và là một tệp ký tự đặc biệt.-dFILE– Đúng nếu FILE tồn tại và là một thư mục.-eFILE– Đúng nếu FILE tồn tại và là một tệp, bất kể loại (nút, thư mục, ổ cắm, v.v.).-fFILE– Đúng nếu FILE tồn tại và là một tệp thông thường (không phải thư mục hoặc thiết bị).-GFILE– Đúng nếu FILE tồn tại và có cùng nhóm với người dùng đang chạy lệnh.-hFILE– Đúng nếu FILE tồn tại và là một liên kết tượng trưng.-gFILE– Đúng nếu FILE tồn tại và đã đặtsgidset -group-id ( ).-kFILE– Đúng nếu FILE tồn tại và có một cờ bit dính.-LFILE– Đúng nếu FILE tồn tại và là một liên kết tượng trưng.-OFILE– Đúng nếu FILE tồn tại và thuộc sở hữu của người dùng chạy lệnh.-pFILE– Đúng nếu FILE tồn tại và là một pipeline.-rFILE– Đúng nếu FILE tồn tại và có thể đọc được.-SFILE– Đúng nếu FILE tồn tại và là một socket.-sFILE– Đúng nếu FILE tồn tại và có kích thước khác không.-uFILE– Đúng nếu FILE tồn tại vàsuidset-user-id ( ) được đặt.-wFILE– Đúng nếu FILE tồn tại và có thể ghi được.-xFILE– Đúng nếu FILE tồn tại và có thể thực thi được.
Phần kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu cách kiểm tra xem tệp hoặc thư mục có tồn tại trong Bash hay không.
Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng để lại bình luận.
