Shell script là gì: Từ A-Z về công cụ dòng lệnh cho lập trình viên

Nếu bạn muốn tự động hóa công việc trên hệ điều hành Unix-like như Linux và macOS, shell script là công cụ không thể thiếu. Thông qua việc viết các lệnh vào một tệp, bạn có thể tự động thực hiện các tác vụ như quản lý tệp, giám sát hệ thống hay sao lưu mà không cần phải thao tác thủ công. 

Đọc bài viết này để hiểu rõ hơn về:

  • Shell script là gì? Một số khái niệm cơ bản về shell script
  • Lợi ích và hạn chế của việc sử dụng shell script
  • Các bước thực hiện shell script
  • Các loại shell

Shell script là gì?

Shell script là một tệp văn bản chứa một chuỗi các lệnh mà hệ điều hành Unix hoặc Linux có thể thực thi. Thay vì phải nhập các lệnh thủ công mỗi lần, bạn có thể viết chúng vào một tệp (gọi là script) và chỉ cần chạy tệp đó. Các lệnh trong script sẽ được thực hiện theo trình tự, giúp tự động hóa các tác vụ lặp đi lặp lại. Shell script giúp tiết kiệm thời gian và công sức, đặc biệt khi cần thực hiện các tác vụ phức tạp hoặc nhiều lần. 

Đối với các hệ điều hành khác nhau, script có thể được gọi là batch file (.bat hoặc .cmd) trên Windows hoặc EXEC trên các hệ thống lớn như mainframe. Một shell script có thể chứa tham số, chú thích và các lệnh con để làm cho việc tự động hóa trở nên linh hoạt và mạnh mẽ.

Shell script có thể chạy trên các hệ thống UNIX-like (Linux, macOS) mà không cần thay đổi nhiều. Ngoài ra, có thể dễ dàng kết hợp với các công cụ dòng lệnh như grep, awk, sed để xử lý văn bản và dữ liệu.

Kernel là gì?

Để hiểu được cách shell script hoạt động và cách nó tương tác với hệ thống, trước tiên chúng ta cần hiểu về kernel

Kernel là phần quan trọng nhất của hệ điều hành, nó giống như “bộ não” của hệ thống giúp điều khiển tất cả các phần cứng và phần mềm trong máy tính. Kernel có chức năng quan trọng như quản lý bộ nhớ (RAM), xử lý các chương trình đang chạy, điều khiển các thiết bị như chuột, bàn phím, ổ cứng và xử lý các yêu cầu vào/ra (I/O). 

Ví dụ, khi bạn mở một ứng dụng, kernel sẽ đảm bảo rằng ứng dụng đó có đủ tài nguyên để hoạt động.  Một hệ thống Linux hoàn chỉnh bao gồm kernel, các tiện ích và thư viện GNU, các script quản lý và script cài đặt.

Shell là gì?

Tiếp theo, để tương tác với kernel, người dùng cần một chương trình gọi là shell. 

Shell là chương trình giúp bạn giao tiếp với hệ điều hành thông qua dòng lệnh. Bạn có thể hiểu Shell như một “cầu nối” giữa bạn và máy tính. Khi bạn gõ lệnh trên terminal, shell sẽ hiểu và truyền các lệnh đó cho Kernel để thực thi. Có hai loại Shell chính:

  • Command Line Shell: Đây là loại giao diện dòng lệnh, nơi bạn nhập lệnh và nhận kết quả ngay trên màn hình.
  • Graphical Shell: Là giao diện đồ họa mà bạn thấy trên màn hình (như các cửa sổ, biểu tượng trên desktop).

Shell được khởi động khi người dùng đăng nhập vào hệ thống hoặc mở terminal. Các shell phổ biến trên hệ điều hành Linux bao gồm Bash, sh, csh và zsh. Shell giúp người dùng thực hiện các tác vụ quản lý hệ thống và chạy các chương trình.

Đọc thêm: Shell vs Bash: Phân biệt và lựa chọn công cụ phù hợp

Ứng dụng của shell scripting

Việc sử dụng shell script mang lại nhiều lợi ích, đặc biệt trong việc tự động hóa và tối ưu hóa các tác vụ hệ thống. Dưới đây là một số lý do bạn nên dùng shell script:

  • Tự động hóa các tác vụ lặp đi lặp lại: Thay vì làm thủ công các tác vụ như sao lưu dữ liệu, cập nhật phần mềm, kiểm tra trạng thái hệ thống, dọn dẹp tệp tạm, hoặc cập nhật phần mềm,… mỗi ngày, bạn có thể viết một script để thực hiện các công việc này tự động, giúp tiết kiệm thời gian và giảm thiểu sai sót. 

Ví dụ: Tạo script sao lưu dữ liệu hàng ngày vào một thư mục dự phòng.

  • Quản trị hệ thống: Shell scripting là công cụ không thể thiếu trong quản trị hệ thống. Các quản trị viên hệ thống (system admin) có thể sử dụng shell script để kiểm tra tình trạng hệ thống, giám sát bộ nhớ, kiểm tra ổ đĩa, và xử lý các sự cố tự động. Điều này giúp duy trì sự ổn định của hệ thống mà không cần sự can thiệp thủ công. 

Ví dụ: Sử dụng script để theo dõi dung lượng ổ đĩa và gửi cảnh báo khi ổ đĩa gần đầy.

  • Quản lý tệp và dữ liệu: Shell scripting giúp xử lý tệp và dữ liệu một cách nhanh chóng và hiệu quả. Bạn có thể sử dụng script để tìm kiếm tệp, thay đổi tên tệp, di chuyển hoặc xóa tệp, hay thậm chí trích xuất và phân tích dữ liệu từ các tệp log. 

Ví dụ: Tìm kiếm các tệp log có lỗi và gửi thông báo tới quản trị viên.

  • Tích hợp và triển khai phần mềm (DevOps): Trong môi trường DevOps, shell scripting được sử dụng rộng rãi để tự động hóa các quy trình triển khai phần mềm, từ cấu hình máy chủ, triển khai ứng dụng cho đến kiểm tra các bản cập nhật. Điều này giúp đảm bảo quy trình triển khai nhanh chóng, nhất quán và giảm thiểu lỗi. 

Ví dụ: Viết script để tự động cài đặt và cấu hình môi trường máy chủ trước khi triển khai ứng dụng.

  • Phân tích và xử lý dữ liệu: Shell scripting hỗ trợ xử lý và phân tích dữ liệu lớn một cách hiệu quả. Bạn có thể sử dụng các công cụ như awk, sed và grep trong script để phân tích tệp dữ liệu hoặc báo cáo. 

Ví dụ: Phân tích các tệp log hệ thống, tìm ra các lỗi và tạo báo cáo thống kê.

  • Lập lịch công việc tự động: Shell script kết hợp với công cụ cron cho phép lập lịch các công việc tự động chạy vào thời điểm cụ thể. 

Ví dụ: Lập lịch chạy script sao lưu dữ liệu vào 2 giờ sáng hàng ngày khi lưu lượng hệ thống thấp.

  • Kiểm tra và giám sát mạng: Shell script có thể được sử dụng để kiểm tra trạng thái kết nối mạng, ping tới các máy chủ, kiểm tra các cổng đang mở và giám sát băng thông. 

Ví dụ: Script để kiểm tra liên tục kết nối internet và gửi thông báo khi phát hiện mất kết nối.

Hạn chế khi sử dụng shell script

  • Dễ mắc lỗi nghiêm trọng: Một lỗi nhỏ trong script có thể gây hỏng toàn bộ hệ thống hoặc tạo ra những tác động không lường trước được. Ví dụ như một số thiếu sót trong cú pháp của shell script có thể khiến việc lập trình trở nên khó khăn và dễ mắc lỗi.
  • Tốc độ thực thi chậm: Shell script có thể chậm hơn so với các lệnh độc lập hoặc chương trình biên dịch.
  • Không phù hợp với tác vụ phức tạp: Shell script không lý tưởng cho các tác vụ tính toán phức tạp hoặc các chương trình yêu cầu cấu trúc dữ liệu phức tạp.
  • Thiếu cấu trúc dữ liệu mạnh mẽ: So với các ngôn ngữ scripting khác như Python hay JavaScript, shell script cung cấp ít cấu trúc dữ liệu hơn như mảng và đối tượng.
  • Khó bảo trì khi quy mô lớn: Các shell script phức tạp có thể trở nên khó đọc và bảo trì khi số lượng dòng code tăng lên, đặc biệt khi thiếu cơ chế quản lý module và package như các ngôn ngữ lập trình hiện đại.

Đọc thêm: Bash script là gì? Cách chạy Bash script hiệu quả

Các khái niệm cơ bản trong cú pháp shell script

Cú pháp shell script giống như các lệnh dòng lệnh thông thường, giúp việc viết mã và triển khai nhanh chóng mà không cần biên dịch. Viết Shell script còn được đánh giá nhanh và dễ dàng hơn so với các ngôn ngữ lập trình khác. Ngoài ra còn dễ dàng debug và sửa lỗi nhanh chóng trong quá trình sử dụng. Các khái niệm cơ bản mà bạn cần biết bao gồm:

Shebang

Khi bạn viết một Shell script, dòng đầu tiên thường bắt đầu với #!/bin/bash. Đây là shebang. Nó giống như một chỉ dẫn cho hệ thống biết phải dùng shell nào để chạy các lệnh trong script. Nếu bạn viết Bash script, thì dòng này sẽ là #!/bin/bash, và nó cho hệ thống biết sử dụng Bash để thực thi các lệnh. Ví dụ:

#!/bin/bash
echo "Hello, world!"

Khi bạn chạy script này, nó sẽ hiển thị “Hello, world!” trên màn hình. Shebang giúp đảm bảo rằng các lệnh trong script sẽ được thực thi bởi đúng shell.

Biến (Variables)

Biến trong Shell script là một cách để lưu trữ dữ liệu mà bạn có thể sử dụng sau này trong script của mình. Khi bạn định nghĩa một biến, bạn sẽ gán giá trị cho nó và sau đó có thể tham chiếu đến biến đó để sử dụng trong các lệnh tiếp theo. Biến có thể lưu trữ nhiều loại dữ liệu, chẳng hạn như số, chuỗi văn bản hoặc các kết quả từ các lệnh khác.

Trong Linux, có hai loại biến chính:

Biến hệ thống (System Variables)

Biến hệ thống là các biến đã được định nghĩa sẵn bởi hệ điều hành hoặc shell mà bạn đang sử dụng. Các biến này thường được viết hoa và lưu trữ thông tin về hệ thống của bạn, chẳng hạn như tên shell, phiên bản shell, thư mục làm việc hiện tại hoặc các cài đặt đường dẫn.

Ví dụ về biến hệ thống:

  • BASH=/bin/bash: Tên của shell bạn đang sử dụng.
  • PATH=/usr/bin:/bin:/sbin: Đường dẫn các thư mục chứa các lệnh hệ thống.
  • HOME=/home/user: Thư mục chính của người dùng.

Biến người dùng tự định nghĩa (User-defined Variables)

Biến người dùng tự định nghĩa là các biến do người dùng tạo ra để lưu trữ giá trị cần thiết cho các tác vụ trong Shell script. Các biến này thường được viết thường và bạn có thể gán giá trị cho chúng bằng cách sử dụng dấu =.

Ví dụ:

name="Alice"
echo "Hello, $name!"

Ở đây, biến name lưu trữ giá trị “Alice”. Lệnh echo sẽ in ra “Hello, Alice!” khi script chạy.

Câu lệnh điều kiện (Conditional Statements)

Shell script có thể đưa ra quyết định dựa trên các điều kiện. Câu lệnh điều kiện phổ biến là if-then-else, cho phép bạn kiểm tra các giá trị và thực hiện hành động tùy thuộc vào kết quả. Ví dụ:

age=20
if [ "$age" -ge 18 ]; then
    echo "You are an adult."
else
    echo "You are a minor."
fi

Ở đây, script kiểm tra giá trị của biến age. Nếu age lớn hơn hoặc bằng 18, sẽ in ra “You are an adult”. Nếu không, in ra “You are a minor”.

Vòng lặp (Loops)

Vòng lặp cho phép bạn thực thi một nhóm lệnh nhiều lần. Ví dụ, bạn có thể sử dụng vòng lặp để lặp qua các giá trị trong một danh sách và thực hiện thao tác với mỗi giá trị đó.

for i in {1..5}

do
    echo "Number $i"
done

Script trên sẽ in ra các số từ 1 đến 5. Mỗi lần vòng lặp thực hiện, giá trị của i sẽ thay đổi và echo sẽ in “Number 1”, “Number 2”,…

Shell script cũng hỗ trợ các loại vòng lặp khác như while và until:

# Vòng lặp while
count=1
while [ $count -le 5 ]
do
    echo "While loop: $count"
    count=$((count+1))
done

# Vòng lặp until
count=1
until [ $count -gt 5 ]
do
    echo "Until loop: $count"
    count=$((count+1))
done

Hàm (Functions)

Hàm là một nhóm các lệnh được gói lại với nhau để có thể gọi và sử dụng nhiều lần. Điều này giúp mã trở nên dễ đọc và dễ duy trì.

Ví dụ:

greet() {
    echo "Hello, $1!"
}
greet "Alice"

Hàm greet nhận một tham số (ví dụ: “Alice”) và in ra “Hello, Alice!”. Đây là cách để tái sử dụng mã mà không phải viết lại lệnh nhiều lần.

Nhập và xuất (Input and Output)

Shell script có thể nhận dữ liệu từ người dùng và xuất kết quả ra màn hình. Bạn có thể yêu cầu người dùng nhập tên và sau đó in ra lời chào.

Ví dụ:

echo "Enter your name:"
read name
echo "Hello, $name!"

Tham số dòng lệnh (Command Line Arguments)

Shell script có thể nhận các tham số từ dòng lệnh khi được gọi. Các tham số này được truy cập thông qua các biến đặc biệt:

#!/bin/bash
# script_name.sh arg1 arg2 arg3
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "All arguments: $@"
echo "Number of arguments: $#"

Exit Status (Trạng thái thoát)

Mỗi lệnh trong shell đều trả về một giá trị trạng thái khi kết thúc (0 cho thành công, khác 0 cho lỗi). Bạn có thể kiểm tra trạng thái này để xác định lệnh có thành công hay không:

command
if [ $? -eq 0 ]; then
    echo "Command executed successfully"
else
    echo "Command failed"
fi

5 loại shell phổ biến nhất là gì?

Trong hệ điều hành Unix và Linux, có nhiều loại shell khác nhau, mỗi loại có những đặc điểm và tính năng riêng biệt. Dưới đây là một số loại shell phổ biến:

Tên Shell Đặc điểm Ứng dụng
Bourne Shell (sh) Shell gốc của Unix, là loại shell đơn giản, không hỗ trợ các tính năng như ghi lại lệnh trước đó và có khả năng thực thi hạn chế.  Các tác vụ scripting cơ bản, hoặc khi cần hiệu suất nhanh chóng mà không cần nhiều tính năng nâng cao.
Bash (Bourne Again Shell) Là phiên bản nâng cấp của Bourne Shell, hỗ trợ ghi nhớ lịch sử lệnh, tự động hoàn thành lệnh bằng tab và khả năng scripting mạnh mẽ. Shell mặc định trên Linux, macOS, sử dụng cho các tác vụ tự động hóa, quản trị hệ thống, phát triển phần mềm.
C Shell (csh) Cú pháp giống ngôn ngữ lập trình C, hỗ trợ thay thế lịch sử lệnh và điều khiển công việc (job control). Phù hợp khi làm việc với các tiến trình và điều khiển công việc phức tạp.
Korn Shell (ksh) Kết hợp tính năng của Bourne Shell và C Shell, cung cấp các cải tiến như thao tác chuỗi và mảng. Tự động hóa, quản lý hệ thống trong môi trường doanh nghiệp, nơi yêu cầu scripting mạnh mẽ và hiệu suất cao.
Z Shell (zsh) Là loại Shell hiện đại với tính năng hoàn thành tab cải tiến, sửa lỗi chính tả và khả năng tùy chỉnh môi trường làm việc. Phù hợp với những người dùng muốn một shell linh hoạt, dễ sử dụng hơn Bash, với khả năng hỗ trợ plugin và chủ đề.

Các bước cơ bản để thực thi shell script 

Shell script hoạt động theo một quy trình đơn giản nhưng mạnh mẽ. Các bước cơ bản để thực thi script bao gổm:

  1. Viết script: Đầu tiên, bạn viết các lệnh trong một tệp văn bản bằng cách sử dụng trình soạn thảo văn bản, như Vim, Nano hoặc bất kỳ công cụ nào hỗ trợ soạn thảo văn bản. Các lệnh trong script được viết bằng cú pháp mà shell có thể hiểu và thực thi.
  2. Lưu và cung cấp quyền thực thi: Sau khi viết xong script, bạn lưu tệp với phần mở rộng .sh (theo quy ước chuẩn). Sau đó, bạn cấp quyền thực thi cho tệp bằng lệnh chmod +x script_name.sh để shell có thể thực thi tệp đó.
  3. Thực thi script: Khi script đã có quyền thực thi, bạn có thể chạy nó bằng cách nhập đường dẫn đến script vào terminal, ví dụ: ./script_name.sh (nếu bạn đang ở cùng thư mục) hoặc /đường/dẫn/đến/script_name.sh. Shell sẽ thực thi các lệnh trong script theo thứ tự, giống như bạn nhập từng lệnh một trong dòng lệnh.

Shell script hỗ trợ nhiều chức năng mạnh mẽ như vòng lặp, biến, câu lệnh điều kiện if-then-else, mảng, và các phím tắt. Những chức năng này giúp bạn tạo ra các script mạnh mẽ và linh hoạt để thực hiện các tác vụ phức tạp.

Qua đó, shell script giúp tự động hóa công việc, tiết kiệm thời gian và giảm thiểu các lỗi do thao tác thủ công, đồng thời làm việc hiệu quả trên hệ thống Unix-like.

Câu hỏi thường gặp về shell script

Shell script có thể sử dụng các lệnh nào?

Shell Script có thể sử dụng hầu hết các lệnh có sẵn trong shell như ls, cp, mv, rm, echo, cat, grep, awk, sed và nhiều lệnh khác. Các lệnh này giúp bạn quản lý tệp, xử lý chuỗi, tìm kiếm thông tin và thực hiện các tác vụ khác trong hệ thống.

Powershell có phải shell script không?

Không, Powershell không phải là một Shell script. Powershell là một ngôn ngữ lập trình và môi trường dòng lệnh dành cho hệ điều hành Windows. Mặc dù nó có thể thực thi các lệnh giống như Shell script, nhưng Powershell sử dụng cú pháp và tính năng khác biệt so với các shell truyền thống như Bash hay sh trên Linux.

Đọc thêm: PowerShell là gì chi tiết: Tính năng, Cài đặt, Mẹo sử dụng nên biết

Điểm khác biệt giữa Linux và shell script là gì?

Linux là một hệ điều hành, trong khi Shell script là một tập hợp các lệnh viết trong một tệp văn bản để tự động hóa các tác vụ trên hệ thống. Linux cung cấp môi trường và công cụ để chạy Shell script, trong khi Shell script chỉ là phương tiện để thực hiện các tác vụ, như sao lưu dữ liệu, quản lý tệp, hay giám sát hệ thống.

Command line shell và Graphical shell khác nhau thế nào?

Command Line Shell (Shell dòng lệnh) là kiểu shell mà người dùng tương tác trực tiếp thông qua các lệnh văn bản nhập vào cửa sổ dòng lệnh. Các shell này như Bash, C Shell, Korn Shell hay Z Shell đều yêu cầu người dùng phải nhớ cú pháp và lệnh để thực hiện các tác vụ hệ thống. Shell dòng lệnh mang lại tính linh hoạt cao và thường được sử dụng trong quản trị hệ thống, tự động hóa, hoặc lập trình.

Còn Graphical Shell (Shell đồ họa) là loại shell cung cấp giao diện người dùng đồ họa, nơi người dùng có thể thao tác trực tiếp với các cửa sổ, biểu tượng và nút bấm thay vì phải nhập các lệnh. Các hệ điều hành như Windows, macOS hay các giao diện desktop Linux đều sử dụng shell đồ họa. Đây là lựa chọn phổ biến cho những người dùng không chuyên, vì tính dễ sử dụng và trực quan.

Command Line Shell và Graphical Shell là hai cách phổ biến được lựa chọn để giao tiếp với hệ thống khi làm việc với hệ điều hành, nhưng lại thường bị nhầm lẫn về cách sử dụng. Mặc dù cả hai đều giúp người dùng tương tác với hệ điều hành, nhưng chúng có những đặc điểm và mục đích sử dụng khác nhau. 

Tiêu chí Command line shell Graphical shell
Giao diện Giao diện dòng lệnh, yêu cầu người dùng nhập các lệnh văn bản. Giao diện đồ họa, người dùng tương tác bằng chuột và các cửa sổ.
Tính dễ sử dụng Khó sử dụng đối với người mới, yêu cầu phải nhớ cú pháp và lệnh. Dễ sử dụng, không cần phải nhớ lệnh, thao tác bằng chuột và biểu tượng.
Tính linh hoạt Cung cấp tính linh hoạt cao, thích hợp cho các tác vụ phức tạp. Thiếu linh hoạt, phù hợp với tác vụ đơn giản và không cần chính xác cao.
Tốc độ Thực thi nhanh và hiệu quả, đặc biệt đối với các tác vụ tự động. Có thể chậm hơn, nhất là khi thực hiện các tác vụ phức tạp hoặc cần nhiều cửa sổ.
Khả năng tự động hoá Tốt, dễ dàng viết script để tự động hóa các tác vụ. Hạn chế trong tự động hóa, chủ yếu dựa vào thao tác người dùng.
Ví dụ Bash, C Shell, Korn Shell Windows Explorer, macOS Finder, Ubuntu Desktop
Tính chính xác Độ chính xác cao, phù hợp với các tác vụ yêu cầu độ chính xác cao. Đôi khi thiếu độ chính xác, dễ xảy ra lỗi nếu không cẩn thận.
Ứng dụng Quản trị hệ thống, tự động hóa, xử lý tập lệnh, phát triển, quản lý hệ thống từ xa. Sử dụng phổ biến trong các tác vụ thông thường như duyệt web, soạn thảo văn bản.
Khả năng làm việc từ xa Xuất sắc, có thể dễ dàng làm việc từ xa thông qua SSH với băng thông thấp Hạn chế, cần băng thông cao và các giải pháp như VNC/RDP để làm việc từ xa

Tổng kết

Ứng dụng của Shell script trong tự động hóa và quản lý hệ thống là không phải bàn cãi. Tuy nhiên, để có thể tận dụng tối đa sức mạnh của Shell script, bạn cần phải bắt đầu từ những khái niệm cơ bản. Khi hiểu rõ các khái niệm như biến, câu lệnh điều kiện, vòng lặp và các chức năng của Shell script, bạn sẽ dễ dàng xây dựng những script mạnh mẽ, tự động hóa các tác vụ và tối ưu hóa công việc một cách hiệu quả hơn.

ITviec hy vọng bài viết trên đã mang lại cho bạn cái nhìn tổng quan về Shell script, giúp bạn hiểu rõ hơn về khái niệm, ứng dụng và lợi ích của công cụ mạnh mẽ này.