Các lệnh ghép đơn giản — chẳng hạn như xâu chuỗi một số lệnh lại với nhau thành một chuỗi trên dòng lệnh — thường được sử dụng. Các lệnh như vậy được phân tách bằng dấu chấm phẩy, xác định phần 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 từng lệnh bằng dấu chấm phẩy, như sau:
command1 ; command2 ; command3 ; command4 ;
Bạn không cần phải thêm dấu chấm phẩy cuối cùng vì nhấn phím Enter có nghĩa là kết thúc lệnh cuối cùng, nhưng bạn có thể thêm nó để nhất quán.
Tất cả các lệnh sẽ chạy mà không có vấn đề gì - miễn là không có lỗi xảy ra. Nhưng điều gì sẽ xảy ra nếu lỗi xảy ra? Chúng tôi có thể lường trước và cho phép xảy ra lỗi bằng cách sử dụng && và || các toán tử điều khiển được tích hợp sẵn trong Bash. Hai toán tử điều khiển này cung cấp một số điều khiển luồng và cho phép chúng tôi thay đổi trình tự thực thi mã. Dấu chấm phẩy và dòng mới ký tự cũng được coi là toán tử điều khiển Bash.
&& toán tử chỉ đơn giản nói "nếu command1 thành công, sau đó chạy command2." Nếu command1 không thành công vì bất kỳ lý do gì, command2 sẽ không chạy. Cú pháp đó giống như sau:
command1 && command2
Điều này hoạt động vì mọi lệnh trả về một mã cho trình bao cho biết nó đã hoàn thành thành công hay thất bại trong quá trình thực thi. Theo quy ước, mã trả về (RC) bằng 0 (không) cho biết thành công và bất kỳ số dương nào cho biết một số loại thất bại. Một số công cụ sysadmin chỉ trả về 1 để cho biết bất kỳ lỗi nào, nhưng nhiều công cụ sử dụng các mã số dương khác để chỉ ra loại lỗi.
Bash shell của $? biến có thể được kiểm tra rất dễ dàng bằng script, bằng lệnh tiếp theo trong danh sách lệnh hoặc thậm chí trực tiếp bằng sysadmin. Hãy nhìn vào RCs. Chúng ta có thể chạy một lệnh đơn giản và ngay lập tức kiểm tra RC, lệnh này sẽ luôn liên quan đến lệnh cuối cùng đã 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, có nghĩa là lệnh đã hoàn thành thành công. Bây giờ, hãy thử lệnh tương tự trên một thư mục mà chúng tôi không có quyền.
[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 ~]$
Ý nghĩa của RC này có thể được tìm thấy trong ls trang người của lệnh.
Hãy thử && toán tử điều khiển vì nó có thể được sử dụng trong chương trình dòng lệnh. Chúng ta sẽ bắt đầu với một việc đơn giản:Tạo một thư mục mới và nếu thành công, hãy tạo một tệp mới trong đó.
Chúng ta cần một thư mục để tạo các thư mục khác. Trước tiên, hãy tạo một thư mục tạm thời trong thư mục chính của bạn, nơi bạn có thể thực hiện một số thử nghiệm.
[student@studentvm1 ~]$ cd ; mkdir testdir
Tạo một thư mục mới trong ~ / testdir , sẽ trống vì bạn vừa tạo, sau đó tạo một tệp mới, trống trong thư mục mới đó. Lệnh sau sẽ thực hiện 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 tôi biết mọi thứ đều hoạt động bình thường vì testdir thư mục có thể truy cập và ghi được. Thay đổi quyền trên testdir vì vậy người dùng sinh viên không thể truy cập được nữa như sau:
[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
[student@studentvm1 ~]$
Sử dụng grep lệnh sau danh sách dài ( ll ) hiển thị danh sách cho testdir . Bạn có thể thấy rằng người dùng sinh viên không còn quyền truy cập vào testdir danh mục. Bây giờ, hãy chạy lệnh gần như tương tự như trước nhưng thay đổi nó để tạo tên thư mục khác bên 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ù chúng tôi đã nhận được thông báo lỗi, bằng cách sử dụng && người điều khiển ngăn chạm lệnh không chạy vì đã xảy ra lỗi khi tạo testdir3 . Loại điều khiển luồng logic theo dòng lệnh này có thể ngăn chặn lỗi từ việc ghép lại và tạo ra một mớ hỗn độn thực sự. Nhưng hãy làm cho nó phức tạp hơn một chút.
|| toán tử điều khiển cho phép chúng tôi thêm một lệnh khác thực thi khi câu lệnh chương trình ban đầu trả về mã lớn hơn 0.
[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 của chúng tôi sử dụng điều khiển luồng có dạng chung này khi chúng tôi sử dụng && và || toán tử điều khiển:
Các lệnh trướcpreceding commands ; command1 && command2 || command3 ; following commands
Lệnh ghép sử dụng các toán tử điều khiển có thể được đặt trước và theo sau bởi các lệnh khác có thể liên quan đến các lệnh 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ả các lệnh đó sẽ thực thi mà không liên quan đến bất kỳ điều gì diễn ra bên trong lệnh ghép điều khiển luồng.
Các toán tử điều khiển luồng này có thể làm cho việc làm việc tại dòng lệnh hiệu quả hơn bằng cách xử lý các quyết định và cho chúng tôi biết khi có sự cố xảy ra. Tôi sử dụng chúng trực tiếp trên dòng lệnh cũng như trong các tập lệnh.
Bạn có thể dọn dẹp với tư cách là người dùng gốc để xóa thư mục và nội dung của nó.
[root@studentvm1 ~]# rm -rf /home/student/testdir
Bạn sử dụng toán tử điều khiển Bash như thế nào? Hãy cho chúng tôi biết trong phần bình luận.