![Cách kiểm tra xem tệp có tồn tại trong Tập lệnh Linux Bash không Cách kiểm tra xem tệp có tồn tại trong Tập lệnh Linux Bash không](https://www.howtogeek.com/wp-content/uploads/2019/06/Linux-laptop-showing-a-bash-prompt.jpg?width=1198&trim=1,1&bg-color=000&pad=1,1)
Nếu một tập lệnh Linux Bash dựa trên các tệp hoặc thư mục nhất định hiện có, thì không thể cho rằng chúng có. Nó cần phải kiểm tra xem họ chắc chắn có mặt. Đây là cách để làm điều đó.
Đừng giả định bất cứ điều gì
Khi viết kịch bản, bạn không thể đưa ra giả định về những gì có và không có trên máy tính. Điều đó hoàn toàn đúng nếu tập lệnh sẽ được phân phối và chạy trên nhiều máy tính khác nhau. Sớm hay muộn, tập lệnh sẽ chạy trên máy tính không đáp ứng các giả định của bạn và tập lệnh sẽ bị lỗi hoặc chạy không thể đoán trước.
Mọi thứ chúng ta định giá hoặc tạo trên máy tính đều được lưu trữ trong một tệp có định dạng nào đó và tất cả các tệp đó nằm trong một thư mục. Tập lệnh có thể đọc, viết, đổi tên, xóa và di chuyển tệp và thư mục—tất cả những việc bạn có thể thực hiện trên dòng lệnh.
Lợi thế mà bạn có với tư cách là con người là bạn có thể xem nội dung của một thư mục và bạn biết liệu một tệp có tồn tại hay không—hoặc liệu thư mục dự kiến có tồn tại hay không. Nếu một tập lệnh bị lỗi khi đang thao tác với tệp, tập lệnh đó có thể gây ra hậu quả nghiêm trọng và có hại.
Bash cung cấp một bộ kiểm tra toàn diện mà bạn có thể sử dụng để phát hiện các tệp và thư mục cũng như kiểm tra nhiều thuộc tính của chúng. Việc kết hợp những thứ này vào các tập lệnh rất dễ dàng, nhưng lợi ích về độ bền và khả năng kiểm soát tốt là rất đáng kể.
Phạm vi thử nghiệm
Bằng cách kết hợp câu lệnh if với phép thử thích hợp từ một tập hợp lớn các phép thử tệp và thư mục, chúng ta có thể dễ dàng xác định xem một tệp có tồn tại hay không, liệu nó có thể thực thi được hay có thể ghi được hay không, v.v.
- -b: Trả về true nếu tệp là tệp đặc biệt của khối.
- -c: Trả về true nếu tệp là ký tự đặc biệt.
- -d: Trả về true nếu “file” là một thư mục.
- -e: Trả về true nếu tệp tồn tại.
- -f: Trả về true nếu tệp tồn tại và là tệp thông thường.
-
-g: Trả về true nếu tệp có
setgid
tập quyền (chmod g+
). - -h: Trả về true nếu tệp là một liên kết tượng trưng.
- -L: Trả về true nếu tệp là một liên kết tượng trưng.
-
-k: Trả về giá trị true nếu đã đặt bit cố định (
chmod +t
). - -P: Trả về true nếu tệp là một đường ống có tên.
- -r: Trả về true nếu tệp có thể đọc được.
- -S: Trả về true nếu tệp tồn tại và không trống.
- -S: Trả về true nếu tệp là một ổ cắm.
- -t: Trả về true nếu bộ mô tả tệp được mở trong một thiết bị đầu cuối.
-
-u: Trả về true nếu tệp có
setuid
tập quyền (chmod u+
). - -w: Trả về true nếu tệp có thể ghi được.
- -x: Trả về true nếu tệp có thể thực thi được.
- -ô: Trả về true nếu thuộc sở hữu của bạn.
- -G: Trả về true nếu thuộc sở hữu của nhóm bạn.
- -N: Trả về true nếu tệp đã được sửa đổi kể từ lần đọc cuối cùng.
- !: Toán tử logic NOT.
- &&: Toán tử logic AND.
- ||: Toán tử logic OR.
Danh sách bắt đầu với -b
bởi vì -a
kiểm tra đã không được chấp nhận và được thay thế bằng -e
kiểm tra.
Sử dụng các bài kiểm tra trong tập lệnh
Kiểm tra tập tin chung if
tuyên bố là một cấu trúc kịch bản đơn giản. So sánh trong ngoặc kép” [[ ]]
” sử dụng -f
kiểm tra để xác định xem có tồn tại tệp thông thường với tên đó hay không.
Sao chép văn bản của tập lệnh này vào trình chỉnh sửa và lưu vào tệp có tên “script1.sh”, rồi sử dụng chmod
để làm cho nó có thể thực thi được.
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 cannot be found." fi
Bạn phải chuyển tên của tệp vào tập lệnh trên dòng lệnh.
chmod +x script1.sh
Bạn sẽ cần thực hiện việc này với từng tập lệnh nếu muốn thử các ví dụ khác trong bài viết.
Hãy thử tập lệnh trên một tệp văn bản đơn giản.
./script1.sh test-file.txt
Tệp tồn tại và tập lệnh báo cáo chính xác thực tế đó. Nếu chúng tôi xóa tệp và thử lại, thử nghiệm sẽ không thành công và tập lệnh sẽ báo cáo điều đó cho chúng tôi.
./script1.sh test-file.txt
Trong một tình huống thực tế, kịch bản của bạn sẽ cần thực hiện bất kỳ hành động nào phù hợp. Có lẽ nó đánh dấu lỗi và dừng lại. Có thể nó tạo tập tin và tiếp tục. Nó có thể sao chép thứ gì đó ra khỏi thư mục sao lưu để thay thế tệp bị thiếu. Tất cả phụ thuộc vào mục đích của kịch bản. Nhưng ít nhất bây giờ tập lệnh có thể đưa ra quyết định dựa trên việc biết liệu tệp có tồn tại hay không.
Các -f
cờ kiểm tra xem tệp có tồn tại hay không và có phải là tệp “thông thường” hay không. Nói cách khác, đó không phải là thứ có vẻ là tệp nhưng không phải, chẳng hạn như tệp thiết bị.
Chúng tôi sẽ sử dụng ls để xác minh rằng tệp “/dev/random” tồn tại và sau đó xem tập lệnh tạo ra tệp đó.
ls -lh /dev/random
./script /dev/random
Bởi vì tập lệnh của chúng tôi đang kiểm tra các tệp thông thường và “/dev/random” là một tệp thiết bị nên quá trình kiểm tra không thành công. Rất thường xuyên, để biết được liệu một tệp có tồn tại hay không, bạn cần cẩn thận chọn loại kiểm tra mà bạn sử dụng hoặc bạn cần sử dụng một số kiểm tra.
Đây là “script2.sh”, kiểm tra các tệp thông thường và các tệp thiết bị ký tự.
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 is missing or not a regular file." fi if [[ -c $1 ]] then echo "The file $1 is a character device file." else echo "The file $1 is missing or not a special file." fi
Nếu chúng tôi chạy tập lệnh này trên tệp thiết bị “/dev/random”, thử nghiệm đầu tiên không thành công như chúng tôi mong đợi và thử nghiệm thứ hai thành công. Nó nhận dạng tệp dưới dạng tệp thiết bị.
./script2.sh /dev/random
Trên thực tế, nó nhận ra nó như là một nhân vật tập tin thiết bị. Một số tệp thiết bị là tệp thiết bị khối. Như hiện tại, kịch bản của chúng tôi sẽ không đối phó với những điều đó.
./script2.sh /dev/sda
Chúng ta có thể sử dụng logic OR
toán tử và bao gồm một thử nghiệm khác trong câu lệnh if thứ hai. Lần này, liệu tệp có phải là tệp thiết bị ký tự hay không hoặc một tệp thiết bị khối, kiểm tra sẽ trả về giá trị đúng. Đây là “script3.sh.”
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 is missing or not a regular file." fi if [[ -c $1 || -b $1 ]] then echo "The file $1 is a character or block device file." else echo "The file $1 is missing or not a special file." fi
Tập lệnh này nhận dạng cả tệp thiết bị ký tự và thiết bị khối.
./script3.sh /dev/random
./script3.sh /dev/sda
Nếu điều quan trọng đối với bạn là phân biệt giữa các loại tệp thiết bị khác nhau, bạn có thể sử dụng lồng nhau if
các câu lệnh. Đây là “script4.sh.”
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 is missing or not a regular file." fi if [[ -c $1 ]] then echo "The file $1 is a character device file." else if [[ -b $1 ]] then echo "The file $1 is a block device file." else echo "The file $1 is missing or not a device file." fi fi
Tập lệnh này nhận dạng và phân loại cả tệp thiết bị ký tự và thiết bị khối.
./script4.sh /dev/random
./script4.sh /dev/sda
Sử dụng toán tử logic AND, chúng ta có thể kiểm tra một số đặc điểm cùng một lúc. Đây là “script5.sh.” Nó kiểm tra xem một tập tin tồn tại và kịch bản đã đọc và viết quyền cho nó.
#!/bin/bash if [[ -f $1 && -r $1 && -w $1 ]] then echo "The file $1 exists and we have read/write permissions." else echo "The file $1 is missing, not a regular file, or we can't read/write to it." fi
Chúng tôi sẽ chạy tập lệnh trên một tệp thuộc về chúng tôi và một tệp thuộc về root
.
./script5.sh .bashrc
./script5.sh /etc/fstab
Để kiểm tra sự tồn tại của một thư mục, hãy sử dụng -d
kiểm tra. Đây là “script6.sh.” Nó là một phần của tập lệnh sao lưu. Điều đầu tiên nó làm là kiểm tra xem thư mục được truyền trên dòng lệnh có tồn tại hay không. Nó sử dụng logic NOT
nhà điều hành !
bên trong if
kiểm tra tuyên bố.
#!/bin/bash if [[ ! -d $1 ]] then echo "Creating backup directory:" $1 mkdir $1 if [[ ! $? -eq 0 ]] then echo "Couldn't create backup directory:" $1 exit fi else echo "Backup directory exists." fi # continue with file backup echo "Backing up to: "$1
Nếu thư mục không tồn tại, nó sẽ tạo ra nó. Nếu các tệp tạo thư mục, tập lệnh sẽ thoát. Nếu việc tạo thư mục thành công hoặc thư mục đã tồn tại, tập lệnh sẽ tiếp tục với các hành động sao lưu của nó.
Chúng tôi sẽ chạy tập lệnh và sau đó kiểm tra với ls
và -d
(thư mục) tùy chọn thư mục sao lưu có tồn tại hay không.
./script6.sh Documents/project-backup
ls -d Documents/project-backup
Thư mục sao lưu đã được tạo. Nếu chúng tôi chạy lại tập lệnh, nó sẽ báo cáo rằng thư mục đã có sẵn.
./script6.sh
Tập lệnh tìm thư mục và chuyển sang thực hiện sao lưu.
Kiểm tra, đừng giả sử
Sớm hay muộn, các giả định sẽ dẫn đến những điều tồi tệ xảy ra. Kiểm tra đầu tiên, và phản ứng tương ứng.
Kiên thức là sức mạnh. Sử dụng các bài kiểm tra để cung cấp cho tập lệnh của bạn kiến thức cần thiết.