Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Chuỗi Lệnh Bash: Sử Dụng Dấu Chấm Phẩy Và Toán Tử Điều Khiển

Các lệnh ghép đơn giản – như nối một vài lệnh theo trình tự trên dòng lệnh – thường được dùng. Các lệnh này được phân tách bằng dấu chấm phẩy, định nghĩa cuối của một lệnh. Để tạo một chuỗi lệnh shell đơn giản trên một dòng, chỉ cần tách mỗi lệnh bằng dấu chấm phẩy, như sau:

command1 ; command2 ; command3 ; command4 ; 

Bạn không cần thêm dấu chấm phẩy cuối vì nhấn Enter ngụ ý kết thúc lệnh cuối, nhưng thêm nó cho nhất quán cũng được.

Tất cả lệnh sẽ chạy không vấn đề – miễn không có lỗi xảy ra. Nhưng nếu lỗi xảy ra thì sao? Chúng ta có thể dự đoán và cho phép lỗi dùng toán tử điều khiển && và || tích hợp trong Bash. Hai toán tử này cung cấp một số điều khiển luồng và cho phép thay đổi trình tự thực thi mã. Dấu chấm phẩy và ký tự newline cũng được coi là toán tử điều khiển Bash.

Toán tử && đơn giản nói "nếu command1 thành công, thì chạy command2." Nếu command1 thất bại vì bất kỳ lý do, command2 không chạy. Cú pháp trông như:

command1 && command2

Điều này hoạt động vì mọi lệnh trả về mã cho shell chỉ ra nó hoàn thành thành công hay thất bại khi thực thi. Theo quy ước, mã trả về (RC) 0 (không) chỉ thành công và bất kỳ số dương nào chỉ loại thất bại. Một số công cụ sysadmin chỉ trả 1 chỉ bất kỳ thất bại, nhưng nhiều dùng mã số dương khác chỉ loại thất bại.

Biến $? của shell Bash có thể kiểm tra dễ dàng bởi script, bởi lệnh tiếp theo trong danh sách lệnh, hoặc ngay cả trực tiếp bởi sysadmin. Hãy xem RC. Chúng ta có thể chạy lệnh đơn giản và ngay lập tức kiểm tra RC, luôn liên quan đến lệnh cuối chạy.

[student@studentvm1 ~]$ ll ; echo "RC = $?"
total 284
-rw-rw-r-- 1 student student 130 Sep 15 16:21 ascii-program.sh
drwxrwxr-x 2 student student 4096 Nov 10 11:09 bin
<snip>
drwxr-xr-x. 2 student student 4096 Aug 18 10:21 Videos
RC = 0
[student@studentvm1 ~]$

RC này là 0, nghĩa là lệnh hoàn thành thành công. Thử cùng lệnh trên thư mục không có quyền.

[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 ~]$

Ý nghĩa RC này có thể tìm trong trang man của lệnh ls.

Hãy thử toán tử điều khiển && như có thể dùng trong chương trình dòng lệnh. Bắt đầu với cái đơn giản: Tạo thư mục mới và, nếu thành công, tạo tệp mới trong đó.

Chúng ta cần thư mục nơi có thể tạo thư mục khác. Đầu tiên, tạo thư mục tạm trong thư mục home để test.

[student@studentvm1 ~]$ cd ; mkdir testdir

Tạo thư mục mới trong ~/testdir, nên rỗng vì vừa tạo, và tạo tệp rỗng mới trong thư mục mới đó. Lệnh sau làm các tác vụ đó.

[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
[student@studentvm1 ~]$ ll ~/testdir/testdir2/
total 0
-rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
[student@studentvm1 ~]$

Chúng ta biết mọi thứ hoạt động như nên vì thư mục testdir truy cập và ghi được. Thay đổi quyền trên testdir để không còn truy cập được cho user student như sau:

[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
[student@studentvm1 ~]$

Dùng lệnh grep sau danh sách dài (ll) hiển thị listing cho testdir. Bạn thấy user student không còn truy cập thư mục testdir. Bây giờ chạy gần như cùng lệnh trước nhưng đổi để tạo tên thư mục khác trong testdir.

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
mkdir: cannot create directory '/home/student/testdir/testdir3': Permission denied
[student@studentvm1 ~]$

Mặc dù nhận thông báo lỗi, dùng toán tử điều khiển && ngăn lệnh touch chạy vì có lỗi tạo testdir3. Loại điều khiển luồng logic dòng lệnh này ngăn lỗi tích lũy và làm bậy mọi thứ. Nhưng hãy làm phức tạp một chút.

Toán tử điều khiển || cho phép thêm lệnh khác thực thi khi câu lệnh ban đầu trả về mã lớn hơn không.

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
mkdir: cannot create directory '/home/student/testdir/testdir3': Permission denied
An error occurred while creating the directory.
[student@studentvm1 ~]$ 

Cú pháp lệnh ghép dùng điều khiển luồng lấy dạng chung này khi dùng toán tử && và ||:

preceding commands ; command1 && command2 || command3 ; following commands

Lệnh ghép dùng toán tử điều khiển có thể đi trước và theo sau bởi lệnh khác liên quan đến cái trong phần điều khiển luồng nhưng không bị ảnh hưởng bởi điều khiển luồng. Tất cả lệnh đó sẽ thực thi không quan tâm bất cứ điều gì xảy ra trong lệnh ghép điều khiển luồng.

Các toán tử điều khiển luồng này làm việc dòng lệnh hiệu quả hơn bằng cách xử lý quyết định và cho biết khi vấn đề xảy ra. Tôi dùng chúng trực tiếp trên dòng lệnh cũng như trong script.

Bạn có thể dọn dẹp như root user để xóa thư mục và nội dung.

[root@studentvm1 ~]# rm -rf /home/student/testdir

Bạn dùng toán tử điều khiển Bash như thế nào? Cho biết ở phần bình luận.