Các nhà phát triển có nhiều kinh nghiệm xây dựng phần mềm chất lượng, cứng nhắc có xu hướng tự động hóa hầu hết công việc của họ bằng cách viết các tập lệnh. Các tập lệnh này bao gồm từ các lệnh bash bí danh đơn giản đến các trình kích hoạt cron lặp đi lặp lại chạy trên máy chủ.
Trong hướng dẫn này, bạn sẽ tìm hiểu về tập lệnh là gì, nhiều trường hợp sử dụng của nó cũng như một số ưu điểm và nhược điểm của việc sử dụng tập lệnh. Chúng ta cũng sẽ xem qua một số tập lệnh mẫu để bạn có thể thấy chúng hoạt động như thế nào.
Tập lệnh là gì?
Tập lệnh là một tập hợp các hướng dẫn được viết bằng bất kỳ ngôn ngữ tập lệnh nào (như Bash, Python, JavaScript và các ngôn ngữ khác) giúp bạn tự động hóa các tác vụ hoặc kiểm soát quy trình. Không giống như các chương trình được biên dịch, các tập lệnh thường được diễn giải, nghĩa là chúng được thực thi trực tiếp bởi môi trường thời gian chạy mà không cần biên dịch trước.
Tập lệnh là công cụ mạnh mẽ để tự động hóa các tác vụ lặp đi lặp lại, quản lý quy trình công việc và giải quyết các vấn đề nhỏ (và đôi khi lớn) một cách hiệu quả. Cho dù bạn là người mới bắt đầu hay nhà phát triển có kinh nghiệm, việc hiểu cách viết tập lệnh có thể nâng cao năng suất và mở rộng khả năng kỹ thuật của bạn.
Tại sao phải viết kịch bản?
Tôi đã đề cập đến những gì bạn có thể làm với tập lệnh. Vì vậy, hãy xem xét một số lợi thế (và cả thách thức của chúng) để bạn hiểu tại sao chúng lại mạnh mẽ đến vậy – và khi nào nên sử dụng chúng.
Ưu điểm của tập lệnh
-
Tự động hóa:Tập lệnh có thể giúp bạn đơn giản hóa các tác vụ lặp đi lặp lại như xử lý dữ liệu hoặc quản lý tệp.
-
Hiệu quả:chúng cũng có thể giúp bạn tiết kiệm thời gian bằng cách tự động hóa các tác vụ mà lẽ ra bạn phải thực hiện thủ công.
-
Giảm lỗi:Tập lệnh có thể giúp giảm lỗi của con người thông qua việc thực thi các hướng dẫn một cách nhất quán.
-
Tính linh hoạt:Tập lệnh có thể thích ứng với nhiều tác vụ khác nhau mà không cần sửa đổi nhiều.
-
Tích hợp:Họ cũng có thể tích hợp liền mạch với các hệ thống, công cụ hoặc quy trình làm việc khác.
Thử thách với kịch bản
-
Hiệu suất:Tập lệnh có thể chậm hơn so với các chương trình được biên dịch do chi phí thông dịch.
-
Khả năng mở rộng:Chúng không phải lúc nào cũng phù hợp với các nhiệm vụ có quy mô lớn hoặc cực kỳ phức tạp.
-
Gỡ lỗi:Các tập lệnh gỡ lỗi đôi khi có thể gặp khó khăn do tính chất động của chúng.
-
Rủi ro bảo mật:Các tập lệnh được viết kém có thể bộc lộ lỗ hổng, đặc biệt nếu chúng thực thi các lệnh cấp hệ thống.
Khi nào nên sử dụng và không sử dụng tập lệnh
Tập lệnh lý tưởng cho:
-
Nhiệm vụ đơn giản, được xác định rõ ràng hoặc chỉ làm một lần
-
Tạo nguyên mẫu hoặc tự động hóa nhanh chóng một quy trình
-
Phạm vi đủ nhỏ để tránh sự phức tạp
Tập lệnh không lý tưởng cho:
-
Các nhiệm vụ quan trọng về hiệu suất đòi hỏi hiệu quả cao. Thay vì sử dụng tập lệnh, hãy thử sử dụng công cụ ETL (Trích xuất, Chuyển đổi, Tải) chuyên dụng hoặc trình chuyển đổi thư hoặc các công cụ thay thế tương tự phù hợp với trường hợp sử dụng của bạn.
-
Các ứng dụng có giao diện người dùng rộng rãi. Thay vào đó, bạn có thể xây dựng một ứng dụng nhỏ hoặc một hệ thống mô-đun với tính năng ghi nhật ký, kiểm tra và tài liệu phù hợp.
-
Các kịch bản cần bảo trì dài hạn, trong đó các chương trình được biên dịch có thể ổn định hơn. Thay vào đó, hãy sử dụng trình lập lịch tác vụ hoặc trình quản lý quy trình làm việc như CRON, Airflow, AWS Lambda/GCP Functions.
Cách viết kịch bản hiệu quả
Đây là quá trình tôi sử dụng để viết các kịch bản hữu ích. Sau khi xem xong phần này, chúng ta sẽ xem một số ví dụ về chữ viết ở các ngôn ngữ khác nhau để bạn có thể thực hành thực hành.
-
Xác định vấn đề:Trước khi viết kịch bản, hãy xác định vấn đề mà nó sẽ giải quyết. Hãy rõ ràng về các nhiệm vụ cần tự động hóa và kết quả mong đợi.
-
Chọn ngôn ngữ phù hợp:
-
Bùng nổ: Lý tưởng cho các tác vụ cấp hệ thống như thao tác tệp hoặc quản lý máy chủ.
-
Python: Tuyệt vời để xử lý dữ liệu, quét web và tự động hóa phức tạp hơn.
-
JavaScript: Thích hợp để phát triển web và tự động hóa dựa trên trình duyệt.
-
-
Viết tập lệnh:Sử dụng trình soạn thảo văn bản hoặc Môi trường phát triển tích hợp (IDE) và đảm bảo bạn tuân theo các phương pháp hay nhất như sử dụng nhận xét, tên biến có ý nghĩa và mã mô-đun. Chúng tôi sẽ đề cập đến những vấn đề này bên dưới.
-
Kiểm tra tập lệnh:Kiểm tra tập lệnh trong môi trường được kiểm soát để đảm bảo tập lệnh hoạt động như mong đợi mà không gây ra lỗi.
-
Thực thi và triển khai:Chạy tập lệnh trong môi trường dự định của nó. Nếu cần, hãy lên lịch thực hiện nó bằng các công cụ như Cron (dành cho Bash) hoặc công cụ lập lịch tác vụ.
Tập lệnh mẫu
Bây giờ bạn đã biết những điều cơ bản, hãy thực hành một chút. Giả sử bạn có khoảng 100 tệp có tên “book-part-1.pdf”, “book-part-2.pdf”, …, “book-part-100.pdf”. Bạn muốn thay thế tất cả dấu gạch nối (-) trong tên tệp bằng dấu gạch dưới (_), vì trang web nơi bạn đang cố tải lên những tài liệu này không cho phép bạn tải lên tệp có tên chứa dấu gạch nối.
Đây là các tập lệnh được viết bằng ba ngôn ngữ khác nhau và tất cả đều thực hiện cùng một thao tác. Quá trình này trông như thế này:
-
tìm tất cả các tập tin trong một thư mục,
-
kiểm tra xem chúng có chứa dấu gạch ngang (-) trong tên của chúng không và
-
thay thế bất kỳ dấu gạch nối nào bằng dấu gạch dưới (_).
Dưới đây là tên tệp để bắt đầu (chứa dấu gạch nối):

Tập lệnh Bash
Chúng ta sẽ bắt đầu với một tập lệnh bash. Đây là:
#!/bin/bash
# Replace "-" with "_" in file names
DIRECTORY="/path/to/your/folder"
for FILE in "$DIRECTORY"/*; do
if [[ "$FILE" == *-* ]]; then
NEW_NAME=$(echo "$FILE" | sed 's/-/_/g')
mv "$FILE" "$NEW_NAME"
echo "Renamed: $FILE -> $NEW_NAME"
fi
done
Chúng tôi xác định thư mục (thư mục) ở trên cùng nơi chứa các tệp của chúng tôi. Đối với mỗi tệp trong thư mục, chúng tôi kiểm tra xem tên có chứa - hay không . Trong trường hợp như vậy, chúng ta tạo một tên tệp mới và lưu nó vào biến NEW_NAME bằng cách sao chép tên tệp cũ bằng echo lệnh và thay thế - với _ sử dụng sed lệnh. Cuối cùng chúng ta sử dụng lệnh di chuyển mv với tên tệp cũ và mới làm đối số.
Tập lệnh Python
Tiếp theo, hãy xem nó trông như thế nào trong Python:
import os
# Replace "-" with "_" in file names
directory = "/path/to/your/folder"
for filename in os.listdir(directory):
if "-" in filename:
old_path = os.path.join(directory, filename)
new_filename = filename.replace("-", "_")
new_path = os.path.join(directory, new_filename)
os.rename(old_path, new_path)
print(f"Renamed: {filename} -> {new_filename}")
Các bước khá giống nhau trong Python. Đầu tiên, chúng ta xác định thư mục và sau đó duyệt qua từng tệp trong thư mục. Để tìm tất cả các file trong thư mục, chúng ta phải sử dụng listdir phương thức từ os gói.
Sau đó, chúng tôi kiểm tra xem tên tệp có chứa - không ở dòng tiếp theo. Trong trường hợp như vậy, chúng tôi tìm thấy đường dẫn hiện tại (old_path ) của tệp bằng cách hợp nhất thư mục và tên tệp của nó. Chúng ta có thể tạo tên file mới bằng cách thay thế - với _ sử dụng replace phương pháp.
Sau đó chúng tôi tạo đường dẫn tệp mới (new_path ) theo cách tương tự chúng ta tạo ra old_path . Cuối cùng, chúng tôi gọi rename phương thức trong os gói có đường dẫn tệp cũ và mới làm đối số.
Tập lệnh JavaScript
Và bây giờ hãy xem nó trông như thế nào trong JavaScript:
const fs = require('fs');
const path = require('path');
const directory = '/path/to/your/folder';
fs.readdir(directory, (err, files) => {
if (err) {
console.error('Error reading directory:', err);
return;
}
files.forEach(file => {
if (file.includes('-')) {
const oldPath = path.join(directory, file);
const newFilename = file.replace(/-/g, '_');
const newPath = path.join(directory, newFilename);
fs.rename(oldPath, newPath, err => {
if (err) {
console.error(`Error renaming ${file}:`, err);
} else {
console.log(`Renamed: ${file} -> ${newFilename}`);
}
});
}
});
});
Việc triển khai JavaScript có phần giống với cách triển khai Python – nhưng bạn sẽ cần viết nhiều mã hơn. Nói chung, các nhà phát triển không thích sử dụng JavaScript cho các loại tập lệnh này. Hầu hết chúng đều dựa vào Bash/Python. JavaScript phù hợp hơn với các tập lệnh tự động hóa dựa trên trình duyệt.
Tuy nhiên, hãy xem những gì chúng ta có ở đây. Trong mã JavaScript này, bạn phải sử dụng hai gói khác nhau, fs và path . Chúng ta xác định thư mục ở trên cùng, đọc các file trong thư mục bằng readdir phương thức từ fs gói và chuyển thư mục làm đối số. Cùng với thư mục, chúng tôi cũng chuyển một hàm gọi lại sẽ được thực thi sau khi đọc tệp.
Bên trong hàm gọi lại, chúng tôi lặp qua từng tệp và kiểm tra xem tên tệp có dấu gạch nối hay không (- ). Nếu đúng như vậy, chúng tôi sẽ tìm đường dẫn cũ bằng path gói có tên thư mục và tệp làm đối số. Sau đó, chúng tôi tạo tên tệp mới bằng cách thay thế tất cả dấu gạch nối bằng dấu gạch dưới bằng cách sử dụng replace phương pháp.
Tương tự như đường dẫn cũ, chúng ta tìm đường dẫn mới sử dụng tên file mới làm đối số. Sau đó chúng ta sử dụng rename phương thức từ fs gói để đổi tên tệp bằng cách chuyển cả tên tệp cũ và mới. Nếu có lỗi trong quá trình đổi tên hoặc đọc tệp trong một thư mục, chúng tôi sẽ ghi lại thông báo lỗi. Nếu không, chúng tôi sẽ ghi lại thông báo thành công.
Cách chạy các tập lệnh này
Được rồi, đây là cách bạn thực sự có thể sử dụng các tập lệnh này:
-
Thay thế
/path/to/your/foldervới thư mục thực tế chứa các tập tin. -
Chạy tập lệnh trong môi trường tương ứng:
-
Bùng nổ: Lưu dưới dạng
.shtập tin, sau đó thực thi vớibash script.sh -
Python: Lưu dưới dạng
.pytập tin, sau đó thực thi vớipython script.py -
JavaScript: Lưu dưới dạng
.jstập tin, sau đó thực thi vớinode script.js
-
Ảnh chụp màn hình bên dưới hiển thị việc chạy tập lệnh bash để thay đổi tên tệp.


Tập lệnh định kỳ
Các tập lệnh định kỳ được thiết kế để thực thi đều đặn, như kiểm tra trạng thái hệ thống hàng tuần, dọn dẹp nhật ký hoặc tìm nạp các bản cập nhật dữ liệu. Các tập lệnh này thường sử dụng một số dạng lập lịch tác vụ.
Các phương pháp tiếp cận phổ biến
-
Công việc CRON:Hầu hết các hệ điều hành đều hỗ trợ CRON, có thể kích hoạt các tập lệnh dựa trên lịch trình xác định.
-
Hàng đợi nhiệm vụ:Các công cụ như Celery (Python), Bull (Node.js) hoặc Sidekiq (Ruby) có thể xử lý các công việc đã lên lịch linh hoạt hơn.
-
Bộ lập lịch trên đám mây:Các dịch vụ như AWS Lambda với EventBridge, Google Cloud Scheduler hoặc Azure Logic Apps cho phép bạn thiết lập các tập lệnh định kỳ trong kiến trúc không có máy chủ.
Một trường hợp sử dụng ví dụ điển hình cho các tập lệnh định kỳ sẽ gửi báo cáo hàng ngày/hàng tuần về việc sử dụng/hiệu suất hệ thống của bạn. Bạn có thể viết một đoạn script tìm số lượng người dùng đã tham gia và đăng ký sản phẩm của bạn rồi gửi báo cáo đó dưới dạng email mỗi ngày/tuần.
Các phương pháp hay nhất để viết tập lệnh
Dưới đây là một số điều cần lưu ý khi bạn viết kịch bản:
1. Sử dụng nhận xét :Giải thích các phần phức tạp của kịch bản bằng các bình luận.
Trong ví dụ bên dưới, nếu không có nhận xét, ai đó có thể phải mất thêm thời gian để tìm hiểu lý do tại sao thuế suất lại là số thập phân chứ không phải phần trăm.
# Calculate the total price with tax
def calculate_price_with_tax(price, tax_rate):
# Tax rate is expressed as a decimal (e.g., 0.07 for 7%)
return price + (price * tax_rate)
2. Xử lý lỗi :Hãy tính đến các lỗi có thể xảy ra và xử lý chúng một cách khéo léo.
Trong ví dụ bên dưới, nếu tệp bị thiếu, tập lệnh sẽ không gặp sự cố – thay vào đó, nó sẽ hiển thị thông báo lỗi hữu ích.
try:
with open('data.csv', 'r') as file:
data = file.readlines()
except FileNotFoundError:
print("Error: 'data.csv' file not found. Make sure the file exists before running the script.")
except Exception as e:
print(f"An unexpected error occurred: {e}")
3. Thiết kế theo mô-đun :Chia tập lệnh thành các hàm hoặc mô-đun có thể sử dụng lại.
Trong ví dụ bên dưới, bằng cách tách chức năng thành các hàm nhỏ hơn, có thể sử dụng lại, bạn có thể gỡ lỗi hoặc sử dụng lại các phần của tập lệnh một cách độc lập.
def fetch_data_from_api(api_url):
# Fetch data from the given API
pass
def process_data(data):
# Process the data into the desired format
pass
def save_to_file(data, filename):
# Save processed data to a file
pass
# Main script
if __name__ == "__main__":
data = fetch_data_from_api("https://example.com/api")
processed_data = process_data(data)
save_to_file(processed_data, "output.json")
4. Xác thực đầu vào :Xác thực thông tin đầu vào của người dùng để ngăn ngừa các lỗi không mong muốn hoặc rủi ro bảo mật.
Nếu không xác thực, ai đó có thể nhập dữ liệu không hợp lệ hoặc độc hại (ví dụ:chuỗi chèn SQL trong một số trường hợp nhất định).
import re
# Validate that the input is a valid email address
def validate_email(email):
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if not re.match(pattern, email):
raise ValueError("Invalid email address format")
return email
# Example usage
try:
user_email = validate_email(input("Enter your email: "))
print(f"Valid email: {user_email}")
except ValueError as e:
print(e)
5. Kiểm soát phiên bản :Sử dụng Git hoặc các công cụ kiểm soát phiên bản khác để theo dõi các thay đổi.
Nếu một thay đổi làm hỏng tập lệnh, bạn có thể dễ dàng hoàn nguyên về cam kết trước đó bằng cách sử dụng git checkout . Ngoài ra, bạn có thể cộng tác liền mạch với các thành viên trong nhóm.
git init
git add script.py
git commit -m "Initial commit"
Kết luận
Viết kịch bản là một kỹ năng có thể nâng cao đáng kể năng suất và khả năng giải quyết vấn đề của bạn. Bằng cách hiểu những kiến thức cơ bản về các ngôn ngữ kịch bản như Bash, Python và JavaScript, bạn có thể tự động hóa các tác vụ, hợp lý hóa quy trình công việc và tiết kiệm thời gian quý báu. Hãy bắt đầu từ quy mô nhỏ, xây dựng dần dần và thực hành viết tập lệnh cho các trường hợp sử dụng khác nhau để thành thạo kỹ năng vô giá này.
Tôi có một bài tập cho bạn. Để chạy và xác minh tập lệnh mẫu này, bạn có thể nghĩ rằng mình phải tạo 100 tệp theo cách thủ công. Điều đó tiêu tốn rất nhiều thời gian.
Tôi đã viết một đoạn script để tạo 100 tệp đó. Tôi cũng khuyên bạn nên thử viết một tập lệnh để tạo 100 tệp có dấu gạch nối trong tên tệp của chúng. Sau đó thử chạy tập lệnh mẫu để chuyển dấu gạch nối thành dấu gạch dưới.
Điều này ban đầu nghe có vẻ khó khăn, nhưng tin tôi đi, bạn chỉ cần viết 5 dòng mã bash để tạo ra 100 tệp. Không chỉ 100 – bạn thậm chí có thể tạo ra hàng triệu/tỷ/nghìn tỷ tệp chỉ với 5 dòng mã.
Nếu bạn muốn tìm hiểu thêm về Tập lệnh, hãy đăng ký nhận bản tin email của tôi (https://5minslearn.gogosoon.com/) và theo dõi tôi trên mạng xã hội.
Chúc bạn viết kịch bản vui vẻ!
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu