Tập lệnh Shell là một phần quan trọng của quá trình tự động hóa trong Linux. Scripting giúp bạn viết một chuỗi các lệnh trong một tệp và sau đó thực thi chúng.
Bạn đang xem: Tìm hiểu bash shell in linux
Nhờ vào scripting, bạn sẽ tiết kiệm được kha khá thời gian do không cần viết đi viết lại những câu lệnh nhất định. Thay vào đó, bạn sẽ thực hiện nó một các tự động hàng ngày, thậm chí còn có thể lên lịch cho nó thực thi.
Bạn cũng có thể đặt một số tập lệnh nhất định để thực thi khi khởi động, chẳng hạn như hiển thị một thông báo cụ thể về việc khởi chạy một phiên mới hoặc đặt một số biến môi trường nhất định.
Nói về script thì các ứng dụng cũng như cách sử dụng nó có rất nhiều, do đó chúng ta hãy cùng theo dõi bài viết sau đây đề tìm hiểu sâu hơn về nó.
Giới thiệu về Bash Shell
Có thể bạn chưa biết, nhưng các dòng lệnh Linux hoạt được dựa vào chương trình cung cấp Shell. Shell đã phát triển để phục vụ cho nhiều tùy chọn khác nhau trong những năm qua.
Một số người dùng khác nhau có nhu cầu cấu hình để được sử dụng các trình shell khác nhau. Nhưng hầu hết người dùng thích gắn bó với trình shell mặc định hiện tại. Shell mặc định cho nhiều bản phân phối Linux là GNU Bourne-Again Shell (bash). Bash được thành công bởi Bourne shell (sh).
Khi bạn khởi chạy trình shell lần đầu tiên, nó sử dụng tập lệnh khởi động nằm trong tệp .bashrc hoặc .bash_profile cho phép bạn tùy chỉnh hành vi của trình shell.
Khi một shell được sử dụng để tương tác, nó sẽ hiển thị $ khi nó đang đợi lệnh từ người dùng. Đây được gọi là dấu nhắc trình shell.
{{EJS0}}Nếu shell đang chạy dưới dạng root, lời nhắc sẽ được thay đổi thành #. Lời nhắc shell superuser có cấu trúc như sau:
{{EJS1}}Bash rất mạnh mẽ vì nó có thể đơn giản hóa một số hoạt động khó thực hiện một cách hiệu quả với GUI. Nhưng đối với các máy chủ, sẽ không hỗ trợ GUI do đó cách tốt nhất là bạn nên học thêm cách sử dụng của giao diện dòng lệnh CLI để có thể sử dụng trong những trường hợp không hỗ trợ GUI.
Bash Script là gì?
Bash Scrip là một chuỗi các lệnh được viết trong một tệp. Chúng được đọc và thực thi bởi chương trình bash. Chương trình này sẽ thực hiện từng dòng lệnh.
Ví dụ: bạn có thể điều hướng đến một đường dẫn nhất định, tạo một thư mục và tạo ra một quy trình bên trong nó bằng dòng lệnh. Bạn có thể thực hiện các bước tương tự theo trình tự bằng cách lưu các tệp trong một tập lệnh bash và thực thi nó. Tập lệnh được chạy với số lần không giới hạn.
Làm thế nào để bạn xác định một tập lệnh Bash?
1. Phần mở rộng tệp .sh
Theo quy ước đặt tên, các tập lệnh bash thường có đuôi .sh. Tuy nhiên, các tập lệnh bash có thể chạy hoàn toàn tốt mà không có phần mở rộng sh.
2. Tập lệnh bắt đầu bằng một bang
Tập lệnh còn được xác định với một shebang. Shebang là sự kết hợp giữa bash # và bang! theo đường dẫn bash shell. Đây là dòng đầu tiên của script. Shebang ra lệnh cho shell thực thi nó thông qua bash shell. Shebang chỉ đơn giản là một đường dẫn tuyệt đối đến trình thông dịch bash.
Dưới đây là một ví dụ về câu lệnh shebang.
{{EJS2}}Đường dẫn của chương trình bash có thể khác nhau. Ở phần sau, chúng ta sẽ cùng tìm hiểu các xác định đường dẫn.
3. Quyền thực thi
Các tập lệnh sẽ cấp quyền thực thi cho người dùng thực thi chúng.
Quyền thực thi được đại diện bằng chữ x. Trong ví dụ bên dưới, người dùng sẽ có quyền rwx (đọc, ghi, thực thi) đối với tệp test_script.sh

4. Màu tệp
Các tập lệnh thực thi xuất hiện với màu khác so với phần còn lại của các tệp và thư mục.
Trong trường hợp này, các tập lệnh có quyền thực thi xuất hiện dưới dạng màu xanh lục.

Cách tạo Bash Script đầu tiên của bạn
Tại đây chúng ta hãy tạo một script đơn giản trong bash để xuất ra Hello World.
1. Tạo một tệp có tên hello_world.sh
{{EJS3}}
2. Tìm đường dẫn đến trình báo bash của bạn
{{EJS4}}Trong ví dụ dưới đây, đường dẫn là /usr/bin/bash và chúng ta sẽ đưa nó vào shebang.
3. Viết lệnh
Sau đây chúng ta sẽ lặp lại “hello world” bằng bảng điều khiển.
Tập lệnh của chúng ta sẽ trông giống như sau:
{{EJS5}}Chỉnh sửa tệp hello_world.sh bằng trình soạn thảo văn bản mà bạn đang sử dụng sau đó thêm các dòng trên vào văn bản.
4. Cung cấp quyền thực thi cho người dùng của bạn
Sửa đổi quyền thực thi đối với tệp và cho phép thực thi tập lệnh bằng cách sử dụng lệnh bên dưới:
{{EJS6}}chmod giúp sửa đổi các quyền hiện có của tệp cho một người dùng cụ thể. Ví dụ trên là đang thêm +x vào người dùng u.
5. Chạy tập lệnh
Bạn có thể chạy tập lệnh theo những cách sau:
{{EJS7}}{{EJS8}}Và đây là kết quả:

Cú pháp cơ bản của Bash Scripting
Cũng giống như bất kỳ ngôn ngữ lập trình nào khác, bash scripting tuân theo một tập hợp các quy tắc để tạo ra các chương trình mà máy tính nào cũng có thể hiểu được. Trong phần này, chúng ta sẽ nghiên cứu cú pháp của bash scripting.
1. Cách xác định các biến
Chúng ta có thể xác định một biến bằng cách sử dụng cú pháp variable_name = value. Để nhận giá trị của biến, hãy thêm $ vào trước biến.
{{EJS9}}

Tux cũng là tên của linh vật biểu tượng cho Linux, đó là chim cánh cụt.

2. Biểu thức số học
Bash còn hỗ trợ các phép tính toán học, sau đây là các toán tử có trong bash:
+ | addition |
– | subtraction |
* | multiplication |
/ | division |
** | exponentiation |
% | modulus |
Chạy ví dụ sau để hiểu rõ hơn về toán tử:

Biểu thức số cũng có thể được tính toán và lưu trữ trong một biến bằng cú pháp dưới đây:
{{EJS10}}Hãy theo dõi ví dụ:

Các phân số sẽ không được tính toán chính xác dựa vào các phép toán trên, thường nó sẽ bị cắt bớt.
Xem thêm: Cách Biểu Diễn Các Số Hữu Tỉ 5/4 Và, Cách Biểu Diễn Số Hữu Tỉ 3/
Do đó, đối với các phép tính thập phân, chúng ta có thể sử dụng lệnh bc để lấy kết quả đến một số vị trí thập phân cụ thể. bc (Bash Calculator) là một máy tính dòng lệnh hỗ trợ tính toán đến một số điểm thập phân nhất định.
{{EJS11}}Trong đó scale thể hiện số lượng vị trí thập phân được xác định sẽ lấy như ở kết quả đầu ra bên dưới.

3. Cách đọc đầu vào của người dùng
Đôi khi bạn sẽ cần thu thập thông tin đầu vào của người dùng và thực hiện các thao tác có liên quan.
Trong bash, chúng ta có thể lấy thông tin đầu vào của người dùng bằng lệnh read.
{{EJS12}}Để nhắc người dùng bằng một thông báo tùy chỉnh, hãy sử dụng cờ -p.
{{EJS13}}Ví dụ:
{{EJS14}}

4. Toán tử logic so sánh số
So sánh được sử dụng để kiểm tra xem các câu lệnh đánh giá là đúng hay sai. Chúng ta có thể sử dụng các toán tử được hiển thị bên dưới để so sánh hai câu lệnh:
Bằng nhau | num1 -eq num2 | is num1 bằng num2 |
Lớn hơn hoặc bằng | num1 -ge num2 | is num1 lớn hơn hoặc bằng num2 |
Lớn hơn | num1 -gt num2 | is num1 lớn hơn num2 |
Bé hơn hoặc bằng | num1 -le num2 | is num1 bé hơn hoặc bằng num2 |
Bé hơn | num1 -lt num2 | is num1 bé hơn num2 |
Không bằng | num1 -ne num2 | is num1 không bằng num2 |
Cú pháp được thực hiện như sau:
{{EJS15}}Ví dụ: Hãy so sánh hai số và tìm mối quan hệ của chúng:
{{EJS16}}Kết quả là:

5. Tuyên bố có điều kiện (Ra quyết định)
Điều kiện là các biểu thức đánh giá thành một biểu thức boolean (đúng hoặc sai). Để kiểm tra điều kiện, chúng ta có thể sử dụng if, if-else, if-elif-else và các điều kiện lồng nhau.
Cấu trúc của câu lệnh điều kiện như sau:
if…then…fi statementsif…then…else…fi statementsif..elif..else..fiif..then..else..if..then..fi..fi.. (Nested Conditionals)Cú pháp lệnh như sau:
{{EJS17}}Để tạo ra các so sánh có ý nghĩa giữa các biến, chúng ta cũng có thể sử dụng AND -a và OR -o.
Câu lệnh dưới đây có nghĩa là: Nếu a lớn hơn 40 và b nhỏ hơn 6.
{{EJS18}}Ví dụ: Hãy tìm loại hình là tam giác bằng cách đọc độ dài các cạnh của nó.
{{EJS19}}Kết quả đầu ra sẽ là:
Trường hợp #1:

Trường hợp #2:

Trường hợp #3:

6. Vòng lặp và bỏ qua
Bạn có thể thực hiện vòng lặp với số lần cụ thể nhất định dựa vào vòng lặp for.
7. Vòng lặp với các số
Trong ví dụ dưới đây, vòng lặp sẽ lặp lại 5 lần.
{{EJS20}}
8. Vòng lặp với các chuỗi
Ngoài ra các chuỗi cũng có thể thực hiện vòng lặp bằng cú pháp như ví dụ sau:{{EJS21}}Kết quả là:

9. Vòng lặp While
Vòng lặp while kiểm tra một điều kiện và lặp lại cho đến khi điều kiện vẫn đúng. Chúng ta cần cung cấp một câu lệnh tăng bộ đếm để điều khiển việc thực thi vòng lặp.
Trong ví dụ dưới đây, dòng lệnh ((i + = 1)) là câu lệnh truy cập làm tăng giá trị của i.
Cú pháp như sau:
{{EJS22}}

10. Đọc tệp
Giả sử chúng ta có một tệp sample_file.txt như hình dưới đây:

Từng dòng một của tệp sẽ được đọc bằng dòng lệnh sau đây và in ra kết quả trên màn hình.
{{EJS23}}Đầu ra in trên màn hình là:

11. Cách thực hiện các lệnh với dấu tích phía sau
Nếu bạn cần shell gồm đầu ra của một lệnh phức tạp trong tập lệnh của mình, bạn có thể viết câu lệnh bên trong dấu ` ` phía sau.
Cú pháp:
{{EJS24}}Ví dụ: Giả sử chúng ta muốn lấy đầu ra của một danh sách các điểm gắn kết với tmpfs trong tên của chúng. Chúng ta có thể tạo một câu lệnh như sau:
{{EJS25}}Để đưa nó vào tập lệnh bash, chúng ta có thể đặt nó trong ` ` phía sau.
{{EJS26}}Và đây là kết quả:

12. Cách lấy đối số cho tập lệnh từ dòng lệnh
Bạn có thể đưa ra các đối số cho script khi thực thi.
Bash Shell là gì?
GNU Bourne-Again SHell (BASH) kết hợp các tính năng từ C Shell (csh) và Korn Shell (ksh) và tuân thủ các thông số kỹ thuật shell POSTIX 2. Nó cung cấp một giao diện dòng lệnh (CLI) để làm việc trên các hệ thống * nix và là shell phổ biến nhất được sử dụng trên các hệ thống Linux.
Bash"s Configuration Files
Trong thư mục home có 3 file có ý nghĩa đặc biệt với bash, cho phép bạn tự động set up môi trường khi bạn log in và gọi tới Bash shell khác, và cho bạn thực thi câu lệnh khi bạn log out. Bash mặc định /etc/profile.
.bash_profile : Đọc và thực hiện các lệnh trong nó mỗi khi đăng nhập hệ thống.bashrc : Đọc mà thực hiện mỗi lần khi bắt đầu một subshell.bash_logout : Đọc và thực hiện mỗi lần thoát khỏi shellBash cho phép có thể tồn tại 2 file khác tương tự như .bash_profile là : .bash_login và .profile. Mỗi khi login thì chỉ có 1 file được đọc.Nếu không có file .bash_profile thì nó sẽ tìm file .bash_login. Nếu file .bash_login cũng không có thì nó mới tìm tới file .profile.Trong trường hợp bạn muốn thực thi lệnh nào đó bất kể bạn đăng nhập hay không đăng nhập thì bạn có thể thêm nó vào file .bashrc.Ví dụ đối với những bạn coder thì thao tác thường duyên như pull code, push code, tạo nhánh, check out. Những công việc mà lặp đi lặp lại hằng ngày, mà chúng ta muốn tiết kiệm thời gian thì có thể set alias theo cách của chúng ta trong những file cấu hình này. Nó sẽ tiết kiệm được kha khá thời gian của chúng ta.
Khi sửa đổi 1 file cấu hình chúng ta có thể dùng lệnh
source file hoặcsource .fileđể đọc các lệnh trong file chúng ta mới thay đổi.
Interactive shells
1.What is an interactive shell?
Là bất kì quá trình nào bạn sử dụng để nhập lệnh và lấy kết quả đầu ra từ các lệnh đó. Do đó log in shell là interactive.Ngược lại, khi bạn chạy một kịch bản, một non-interactive được bắt đầu cái mà sẽ chạy những lệnh trong kịch bản đó và sau đó thoát nó khi đã xong.
Ta có thể test với kí tự đặc biết "-", nó bao gồm "i" khi shell là interactive.
FRAMGIA\nguyen.thai.son
framgia0157-pc:~$ echo $-result: him
BH2.Interactive shell behavior
Một số sự khác biệt trong interactive mode:
Với mỗi loại thì chúng sẽ đọc tệp startup file là khác nhau (/etc/profile, /etc/bashrc, ~/.bash_profile, ~/.bashrc, ...)Job controll được bật mặc định.Lệnh được mặc định đọc từ command line sử dụng readline.Alias expansion được bật.Command history mặc định được bật. Lịch sử được lưu trong tệp trỏ tới bơi HISTFILE khi thoát shell. Mặc định HISTFILE trỏ tới ~/.bash_history.Bash kiểm tra mail định kì.,Bash có thể được cấu hình để thoát khỏi nó khi gặp các biến không được tham chiếu. Ở chế độ interative thì cái này bị tắt.Tự động thoát sau một khaongr thời gian được chỉ định trong biến TMOUT.Aliases
Một alias có thể hiểu nôm na là một chuỗi được thay thế có một dòng lệnh hoặc một cụm các dòng lệnh.ví dụ:
alias gpod="git pull origin develop"thay vì việc phải gõ
git pull origin developthì ta có thể gõ.
gpod
Hoặc ta có thể lồng alias vào trong 1 alias khác.
alias gcod="git checkout develop" alias gpfd="git pull framgia develop" alias gco="git checkout" alias grd="git rebase develop" #get latest pull and run bundle install, migrate alias gud="gcod;gpfd;gco task;grd;bundle install;rake db:migrate"ở trên là một tập hợp các lệnh, Lệnh cuối cùng bao gồm nhiều alias ở trên,Thay vì phải gõ 5 6 lệnh thì chúng ta có thể gõ đúng 1 lệnh duy nhất có 3 từ
gud
Việc này giúp chúng ta cũng tiết kiệm thời gian và tay đỡ to hơn một tí

Conclusion
Trên đây là một chút tìm hiểu của mình về bash shell. Mình nghĩ nó sẽ giúp ích rất nhiều trong công việc lập trình hằng ngày của những coder như mình. Hi vọng gặp lại các bạn ở những bài sau. Cảm ơn vì đã đọc bài. (bow)