Khi chúng ta bắt đầu làm việc với Server, chúng ta sẽ bắt đầu phải làm các tasks như viết code cho 1 crontab, hay viết code cho 1 job jenkins. Những lúc như vậy chúng ta sẽ cần phải biết và hiểu về Shell Script. Đợt vừa rồi mình có làm 1 task về job jenkins trong dự án, con job jenkins đó thì được viết chủ yếu bằng Shell Script. Lúc đầu nhìn code Shell Script mình lé hết cả mắt, chả hiểu mô tê gì, nhưng sau khi tìm hiểu 1 vòng thì mình thấy Shell Script ở mức cơ bản cũng không phải khó lắm. Trong bài viết này mình sẽ tổng hợp lại 1 số kiến thức về Shell Script mà mình đã tìm hiểu được, hy vọng bài viết này sẽ hữu ích cho các bạn mới bắt đầu làm quen với server và bắt đầu phải sờ vào code Shell Script như mình. Nào chúng ta cùng bắt đầu thôi.

Shell Script là gì ?

Nói 1 cách đơn giản, Shell Script cũng giống như hầu hết các ngôn ngữ lập trình mà anh em mình vẫn sử dụng hàng ngày như PHP, Ruby, Java, vv... Chỉ khác là Shell Script là ngôn ngữ chuyên dùng để thao tác với các Server Linux. Cá nhân mình thấy Shell Script có khi còn đơn giản hơn cả các ngôn ngữ lập trình mà anh em mình hay viết. Trong Shell Script không có các khái niệm phức tạp như OOP, class, extend, implement, vv.. (hoặc có thể có mà mình không biết. Ahihi ). Vì vậy, khi tìm hiểu Shell Script chúng ta chỉ cần tìm hiểu 1 số khái niệm cơ bản của 1 ngôn ngữ lập trình là đủ. Con job jenkins trong dự án mình có logic cũng khá phức tạp, nhưng mình thấy nó cũng chỉ sử dụng 1 số khái niệm cơ bản như : khai báo biến, khai báo function, so sánh IF ELSE, chạy vòng lặp FOR, vv .. Có thể ở 1 mức độ cao hơn, Shell Scirpt còn rất nhiều khái niệm phức tạp khác nhưng khi anh em mình mới bắt đầu tìm hiểu, mình nghĩ chỉ cần tìm hiểu được mấy cái cơ bản phía trên là có thể bắt đầu bơi bơi, bập bõm vào làm task được rồi.

Debugging Bash Shell Scripts. Most of you have debugged java/js and… | by  Faizan Ahemad | Medium

Các khái niệm cơ bản trong Shell Script

Chúng ta sẽ tìm hiểu lần lượt các khái niệm như bên dưới.

Những cái này đều là các khái niệm cơ bản trong hầu hết tất cả các ngôn ngữ lập trình nên chắc anh em cũng dễ hiểu thôi.

  • Khai báo và sử dụng biến
  • Sử dụng parameter khi run file Shell Script
  • Array trong Shell Script
  • IF ELSE
  • Hứng kết quả của 1 Command Linux vào 1 biến
  • LOOP FOR
  • LOOP WHILE
  • Khai báo và sử dụng Function

Khai báo và sử dụng biến

Cách khai báo biến trong Shell Script thì chỉ đơn giản như trên.

Ở đầu mỗi file Shell Script :

Chúng ta phải chỉ định chương trình terminal nào sẽ chạy các lệnh trong file Shell Script bằng cách sử dụng ký hiệu Shebang : #!

#!/bin/bash

Ngoài ra, khi khai báo biến, trước và sau dấu = sẽ không có space.

Để chạy tệp lệnh Shell Script có tên "hello" như trên.

Chúng ta chỉ cần đứng tại directory chứa file hello và chạy lệnh

./hello

Sử dụng parameter khi run file shell script

Chúng ta có thể truyền parameter vào file Shell Script bằng cách viết các parameter ngay sau tên file khi chạy lệnh, phân cách nhau bằng dấu space

./hello hanoi danang hcm

Ở bên trong file Shell Script, chúng sẽ sử dụng các ký hiệu $1 $2 $3 để hứng các parameter theo thứ tự được truyền vào.

Ngoài ra sẽ còn 1 số kỵ tự đặc biệt khác như sau :

$0 : Name và Path của file shell script hiện tại
$# : Tổng số parameter được truyền vào
$@ : Tất cả parameter được truyền vào

Array trong Shell Script

Khai báo, sử dụng, truy xuất các phần tử trong 1 Array  như trên.

Ngoài ra còn 1 số ký hiệu đặc biệt cần lưu ý như sau :

${color[@]} : Toàn bộ array color
${#color[@]} : Lenght của array color

Chúng ta cũng có thể thêm, sửa, xóa các element array như sau :  

IF ELSE

Chúng ta có thể viết câu lệnh IF ELSE trong Shell Script theo 3 cách như sau :

if test
if []
if [[]]

Các toán tử so sánh thường dùng với IF ELSE

==  : So sánh bằng
!=  : So sánh khác
-z  : Kiểm tra 1 chuỗi có phải là rỗng hay không
-n  : Kiểm tra 1 chuỗi có giá trị hay không
=~  : So sánh bằng regex

Các toán tử logic thường dùng với IF ELSE

&&  : and
||  : or
!   : false

Ngoài ra chúng ta cũng có thể sử dụng IF ELSE để kiểm tra sự tồn tại của 1 file hay 1 directory nào đó.

Mình nghĩ đây là câu lệnh được dùng khá nhiều trong dự án thật.

Ví dụ : kiểm tra xem 1 file, hoặc 1 directory nào đã đã tồn tại hay chưa, nếu chưa thì tạo file hoặc directory mới có tên abcxzy, vv ..

-f : kiểm tra sự tồn tại của file
-d : kiểm tra sự tồn tại của directory
-e : kiểm tra sự tồn tại của file hoặc của directory

Hứng kết quả của 1 Command Linux vào 1 biến

Mình thấy đây cũng là 1 câu lệnh rất hay dùng trong dự án.

Chúng ta có thể hứng kết quả của 1 Command Linux vào 1 biến bằng cách sử dụng : `` hoặc $()

LOOP FOR

Chúng ta có thể thực hiện vòng lặp FOR theo 1 trong 3 cách bên trên.

Cả 3 cách sẽ đều cho chúng ta kết quả giống nhau.

Ngoài ra, chúng ta cũng có thể thực hiện vòng lặp FOR cho 1 Array như trên.

Kiểu vòng lặp 1 array như thế này mình thấy cũng hay được sử dụng trong dự án.

LOOP WHILE

Tương tự như hầu hết các ngôn ngữ lập trình khác. Shell Script cũng có 2 loại vòng lặp là FOR và WHILE.

Cú pháp của vòng lặp WHILE sẽ được viết như trên. Nó sẽ thực hiện vòng lặp cho đến khi điều kiện của vòng lặp không còn đúng nữa.

Trong cả vòng lặp FOR và WHILE chúng ta có thể sử dụng thêm 2 keyword như bên dưới :

continue : bỏ qua lần lặp đó
break : thoát hẳn khỏi vòng lặp

Ngoài ra, vòng lặp WHILE còn được dùng để lặp các line trong 1 file nào đó.

Mình thấy kiểu lặp này cũng hay được sử dụng trong dự án.

Ví dụ : Chúng ta cần viết 1 con cronjob, mỗi ngày kiểm tra 1 file log nào đó, nếu trong file log đó có chứa 1 cụm keyword nhất định thì sẽ bắn notification lên chanel Slack của dự án chẳng hạn, vv ..

Khai báo và sử dụng Function

Chúng ta có thể khai báo function trong Shell Script bằng cú pháp đơn giản như trên.

Khi cần gọi function đó, chúng ta chỉ cần ghi tên function đó ra là được.

Trong trường hợp chúng ta cần truyền thêm parameter vào function, chúng ta sẽ ghi các parameter sau tên function và cách nhau bởi dấu space.

Bên trong function, chúng ta sẽ hứng các parameter bằng các biến $1 $2 $3 theo thứ tự các parameter được truyền vào.

printName         : Gọi function "printName", không truyền parameter
printName taguchi : Gọi function "printName", với parameter là "taguchi"

Ngoài ra, chúng ta có thể sử dụng return để trả về status run fuction.

Có thể return các giá trị nằm trong khoảng 0~255. Theo default của UNIX, status=0 là thành công, và tất cả status!=0 sẽ là thất bại.

Sử dụng echo $? phía sau 1 command để kiểm tra status run cho command đó.

printName taguchi
echo $?

Tổng kết

Trong bài viết phía trên, mình đã tổng hợp lại 1 số kiến thức về Sheel Script mà mình đã tìm hiểu được. Mình hy vọng các kiến thức trong bài viết này sẽ giúp các bạn có được những kiến thức nền tảng đầu tiền về Shell Script để từ đó chúng ta có thể tìm hiểu thêm các phần kiến thức nâng cao khác. Bài viết chắc chắn còn nhiều điểm thiếu sót, hy vọng các bạn có thể comment và góp ý thêm cho mình. Cảm ơn các bạn đã đọc bài viết, hẹn gặp lại các bạn trong các bài viết lần sau.

Tham khảo

Shell Script Document : https://www.shellscript.sh/

Tutorialspoint : https://www.tutorialspoint.com/unix/shell_scripting.htm

freeCodeCamp : https://www.freecodecamp.org/news/shell-scripting-crash-course-how-to-write-bash-scripts-in-linux/