Tìm hiểu làm việc với Shell
I.Command
1. Arguments
Một trong những tính năng của shell là quét dòng lệnh. Khi bạn nhập command vào màn hình dòng lệnh ( terminal ) và ấn Enter, sau đó shell sẽ bắt đầu scan dòng lệnh, chia nó ra thành nhiều phần. Khi quét dòng lệnh, shell có thể làm thay đổi nhiều giá trị bạn đã nhập Quá trình này được gọi là shell expansion. Khi shell quét và sửa xong dòng lệnh, sau đó, dòng lệnh sẽ được thực thi.
- Các phần trong dòng lệnh được chia ra bởi một hay nhiều dấu cách(hoặc tab) được gọi là các arguments, mọi khoảng trắng đều bị xóa. Argument đầu tiên là lệnh để thực thi, những argument sau được đưa ra để chạy lệnh đó. Shell chia lệnh của bạn ra một hay nhiều argument. ví dụ:
2. Dấu nháy đơn.
Bạn có thể ngay việc xóa dấu cách bằng cách sử dụng nháy đơn. Trích dẫn được xác định bởi dấu nháy đơn được coi như một argument. ví dụ:
3. Dấu nháy kép.
Cũng giống như dấu nháy đơn, trích dẫn được xác định bởi hai dấu nháy kép cũng được coi như một argument. Chúng ta sẽ nói về sự khác nhau giữa nhay đơn và nháy kép sau.
4. Echo và trích dẫn
Các dòng trích dẫn có một số ký tự đặc biệt có thể được nhận biết bởi lệnh echo( khi sử dụng echo -e). ví dụ:
Có nhiều option hơn là tab(\t), xuống dòng(\n) ở trong trang hướng dẫn (man).
5.Lệnh
5.1. Các loại câu lệnh.
- Builtin command là các lệnh được xây dựng bên trong shell. Với tất cả các câu lệnh builtin, sự thực thi nhanh vì nó không cần phải tìm kiếm đường dẫn đến lệnh cũng không cần phải tạo ra một process để chạy lệnh đó. Ví dụ: cd, source, ..
- External command là các lệnh không có sẵn trong shell. Khi shell thực thi những lệnh này, shell phải tìm đường dẫn cho lệnh này ở biến $PATH và cũng phải tạo một process mới để chạy lệnh này.
- Alias là một cách khai báo các lệnh viết tắt nhằm tiết kiệm thời gian gõ phím và dễ nhớ hơn. Thay vì bạn gõ một dòng lệnh dài hàng trăm chử thì bạn chỉ việc gõ đôi ba chữ là có thể thay thế lệnh đó được. Theo mặc định các lệnh viết tắt được lưu trữ trong file ~/.bashrc hoặc ~/.bash_profile, trong đó dấu ~ là viết tắt cho thư mục home của bạn
5.2. Lệnh type
Lệnh
type
giúp chúng ta biết được một lệnh là lệnh builtin hay lệnh external. ví dụ:
- Với lệnh builtin, nó sẽ có output là “$lệnh is a shell builtin”
- Với lệnh external, nó sẽ có ouput là đường dẫn đến file thực thi của lệnh đó. Bạn cũng có thể biết được nếu lệnh đó là một alias
5.3.which, whatis, whereis.
Lệnh whatis
là lệnh dùng để hiển thị mô tả ngắn gọn về một lệnh nào đó.
Lệnh which
là lệnh dùng để tìm kiếm file thực thi cho một câu lênh ở trong biến môi trường $PATH
Lệnh whereis
là lệnh dùng để liệt kê đường dẫn tới các file “có thể hữu ích” đối với một lênh: file thực thi, file manual, source.
6.Alias
- Shell cho phép tạo alias. Những alias thường được tạo như một sự thay thế dễ nhớ hơn cho một lệnh nào đấy.
- cú pháp:
alias [alias]="[lệnh muốn thay thế]"
- Một alias cũng thường được sử dụng để rút gọn câu lệnh
- Alias có thể được sử dụng để đặt tùy chọn mặc định cho một câu lệnh. ví dụ sau đây thêm tùy chọn
-i
là mặc định khi gõ lệnhrm
.
- Bỏ alias bằng câu lệnh
unalias
.
II.Các toán tử điều khiển thi thực hiện command.
1. ;
dấu chấm phẩy
- Bạn có thể gõ hai hay nhiều lệnh trên một dòng, ngăn cách nhau bằng dấu chấm phẩy
;
. Các lệnh sẽ được thực thi một cách tuần tự khi shell đợi lệnh trước thực thi xong trước khi thực thi lệnh sau.
2. &
kí hiệu và
Khi một câu lệnh kết thúc bằng ký hiệu &
, shell sẽ chạy câu lệnh đó dưới dạng backgroud. Bạn sẽ nhận được câu lệnh khi nó thực thi xong trong backgroud.
3. $?
dollar hỏi chấm
Exit code của câu lệnh trước được lưu ở trong biến $?
. Thực ra $?
không phaỉ là biến mà nó là một tham số, bạn không thể gán giá trị cho $?
Exit code bằng 0 nghĩa là lệnh đã thực thi thành công và khác 0 nghĩa là đã sảy ra lỗi.
4. &&
hai dấu và
Shell sẽ hiểu &&
như là một toán tử AND. Khi sử dụng &&
ở giữa hai lệnh, lệnh thứ hai chỉ thực thi khi lệnh đầu tiên thành công( trả về exit code là 0)
&&
cũng làm cho các câu lệnh sau phụ thuộc và kết quả của câu lệnh trước. Ví dụ, lệnh ls
dưới đây phụ thuộc vào kết quả của lệnh cd
.
5. || hai thanh dọc.
|| dại diện cho toán tử OR. Lệnh thứ hai chỉ thực thi khi lệnh đầu lỗi(trả về exit code khác 0)
Một ví dụ nữa:
6. Kết hợp && và ||
Có thể kết hợp && và || để viêt một cấu trúc if-then-else trên command line. Ví dụ:
7. # dấu thăng
Mọi thứ được viết sau dấu thăng # đều bị shell bỏ qua. Nó rất hữu ích để viết shell comment, mà không ảnh hưởng đến quá trình thực thi và expansion của shell.
8. \
Dấu gạch chéo ngược \ cho phép sử dụng các dấu toán tử nhưng shell không phiên dịch nó, đó gọi là escaping character.
9. gạch chéo ngược ở cuối dòng
Những dòng kết thúc với \ sẽ được tiếp tục ở dòng tiếp theo. Quá trình expansion và thực thi dòng lệnh sẽ thực thi khi có một dòng không còn \ ở cuối dòng. Ví dụ
III. Biến trong Shell
- Dấu $: Một ký tự quan trọng nữa được shell nhận diện là ký hiệu dollar $. Shell tìm kiếm biến môi trường có tên giống chuỗi đi theo dấu $ và thay nó bằng giá trị của biến (hoặc không trả về cái gì)
Một số ví dụ:
- Phân biệt hoa thường:Biến trong shell cũng phân biệt hoa thường.
- Tạo biến và gán giá trị: Đây là ví dụ tạo biến MyVAR và gán giá trị cho nó.
-
Dấu nháy: Dấu nháy kép vẫn cho phép shell đọc và thay đổi biến tuy nhiên dấu nháy đơn ngăn chặn điều này.
- set: Sử dụng lệnh
set
để hiển thị danh sách các biến môi trường. - unset: là lệnh dùng để xóa biến môi trường.
- PS1: là biến để xác định shell prompt.
- $PATH:
- Biến $PATH được xác định là nơi mà shell tìm kiếm đường dẫn của các lệnh khi thực thi. biến này chứa một danh sách các thư mục(đường dẫn) được ngăn cách bởi dấu hai chấm.
- Shell sẽ không tìm kiếm lệnh ở thư mục hiện tại để thực thi! Nếu muốn shell tìm kiếm ở thư mục hiện tại thì thêm một dâu . và cuối biến $PATH.
- $PATH ở tài khoản root có thêm thư mục /sbin.
- env:
env
không có option sẽ hiển thị danh sách tất cả những biến đã được export. Điểm khác vớiset
làset
sẽ hiển thị tất các biến bao gồm các biến chưa được export.env
cũng dùng để bắt đầu một clean shell.env -i
dọn sạch môi trường cho subshell.
env
cũng dùng để đặt biến cho một phiên bash và 1 câu lệnh.
- export:
- Bạn có thể export biến shell đến các shell khác với lệnh
export
. Nó sẽ export các biến đến các shell con.
- Nhưng nó không thể export đến các shell cha mẹ (tiếp tục ví dụ trên)
- Bạn có thể export biến shell đến các shell khác với lệnh
- Phân định các biến: để phân định biến ta sử dụng dấu ngoặc nhọn .
- unbound variable: Thường khi in một biến không xác định shell sẽ không hiển thị gì cả, để shell hiển thị lỗi khí biến không tồn tại dùng lệnh
set -u
(nếu muốn nó không hiển thị gì thì sử dụngset +u
)
IV. Nhúng trong shell
- nhúng shell:
- Shell có thể được nhúng trong một câu lệnh.
- Bạn nhúng một shell trong một shell nhúng thì nó được gọi là nested shell.
- backticks:
- Một shell nhúng có thể hưu ích để tránh thay đổi thư mục hiện tại. Có thể sử dụng dấu backtick để nhúng.
- Khác với $(), backtick(`) không thể sử dụng $() để nhúng thêm nested vào nó.
- shell option
- Để xem tất cả các set option có thể sử dụng lệnh
echo $-
- Để xem tất cả các set option có thể sử dụng lệnh
V. Shell history
- Để hiển thị lại câu lệnh trước, gõ !!.
- Để sử dụng lại những câu lệnh khác sử dụng ! với một hay nhiều ký tự. Shell sẽ hiển thị lại câu lệnh gần nhất có những ký tự đó.
- Dùng lệnh
history
để xem lịch sử câu lệnh của shell.(dùng lệnhhistory n
để xem n dòng lệnh cuối cùng)
- Khi sử dụng !n với n là số thứ tự của câu lệnh được hiển thị trong lệnh
history
thì nó sẽ hiển thị và thực thi câu lệnh đó. - Một tùy chọn để tìm kiếm lịch sử là dùng ctrl+r và gõ một chuỗi, shell sẽ tìm kiếm lệnh gần nhất có chuỗi đó.
- $HISTSIZE là biến quy định số command được ghi nhớ
- $HISTFILE là biến hiển thị nơi lưu trữ command history.
- $HISTFILESIZE là số command được lưu trữ trong history file.
- Có thể ngăn không cho lưu lịch sử một lệnh nào đó bằng các thêm dấu cách đằng trước dong lệnh
VI. Regular Expressions
1. Regular Expressions là gì?
- Các regular expression(regex) hay biểu thức quy là các ký tự đặc biệt giúp tìm kiếm dữ liệu.
- regex có khả năng tìm kiếm sâu ký tự cực kì mạnh mẽ. Tóm lại nó là một chuỗi các ký tự giúp tạo mẫu tìm kiếm.
2. Các regex cơ bản.
- Một số lệnh thường được sử dung với regex là
vi
,tr
,sed
vàgrep
. Một số regex cơ bản:
Ký hiệu | Mô tả |
---|---|
. | Khớp bất kỳ kí tự đơn nào |
^ | Đầu chuỗi |
$ | Cuối chuỗi |
* | Khớp với 0 hoặc nhiều lần ký tự trước |
\ | Đại diện cho ký tự đặc biệt |
() | Nhóm biểu thức chính quy |
? | khớp tối đa 1 kí tự |
- Dấu *:
- Dấu * khớp với bất kì cụm ký tự nào kể cả không kí tự nào. Khi không có đường dẫn, shell sẽ sử dụng tên các thư mục và file trong thư mục hiện tại
- Dấu ?:
- Dấu ? là một kí hiệu được nhận diện bởi shell như là một tín hiệu để tìm file, dấu ? khớp với chính xác 1 ký tự.
- Dấu []
- dấu [] khớp bới bất kì một ký tự nào ở trong [].
- Bạn có thể loại trừ một số ký tự ở trong [] bằng cách thêm dấu ! vào trước những ký tự đó.
-
Vùng a-z và 0-9
- Kí tự ^:
- Tìm kiếm kí tự bắt đầu của một chuỗi.
- Kí tự $ tìm kiếm kí tự cuối của một chuỗi.