Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Lập trình Bash Script: Tăng hiệu quả với tự động hóa

Sysadmin, những người chạy và quản lý máy tính Linux gần gũi nhất, có quyền truy cập trực tiếp vào công cụ giúp chúng ta làm việc hiệu quả hơn. Để giúp bạn dùng các công cụ này đến lợi ích tối đa để làm cho cuộc sống dễ dàng hơn, chuỗi bài viết này khám phá việc dùng tự động hóa dưới dạng script shell Bash. Nó bao gồm:

  • Lợi thế của tự động hóa với script shell Bash
  • Tại sao dùng shell script là lựa chọn tốt hơn cho sysadmin so với ngôn ngữ biên dịch như C hoặc C++
  • Tạo tập yêu cầu cho script mới
  • Tạo script shell Bash đơn giản từ chương trình giao diện dòng lệnh (CLI)
  • Nâng cao bảo mật thông qua dùng user ID (UID) chạy script
  • Dùng công cụ so sánh logic để cung cấp điều khiển luồng thực thi cho chương trình dòng lệnh và script
  • Dùng tùy chọn dòng lệnh để kiểm soát chức năng script
  • Tạo hàm Bash có thể gọi từ một hoặc nhiều vị trí trong script
  • Tại sao và cách cấp phép code như open source
  • Tạo và triển khai kế hoạch test đơn giản

Tác giả trước đây viết chuỗi bài viết về lệnh Bash và cú pháp và tạo chương trình Bash tại dòng lệnh, bạn có thể tìm thấy ở phần tham khảo cuối bài. Nhưng chuỗi bốn bài này liên quan đến tạo script (và một số kỹ thuật tác giả thấy hữu ích) cũng nhiều như về lệnh Bash và cú pháp.

Tại sao tôi dùng shell script

Trong Chương 9 của Triết lý Linux cho Sysadmin, tác giả viết:

"Một sysadmin hiệu quả nhất khi suy nghĩ—suy nghĩ về cách giải quyết vấn đề hiện tại và về cách tránh vấn đề tương lai; suy nghĩ về cách giám sát máy tính Linux để tìm manh mối dự báo và báo trước những vấn đề tương lai; suy nghĩ về cách làm cho công việc [của họ] hiệu quả hơn; suy nghĩ về cách tự động hóa tất cả tác vụ cần thực hiện dù hàng ngày hay một năm một lần.

"Sysadmin hiệu quả thứ hai khi tạo chương trình shell tự động hóa giải pháp họ đã nghĩ ra trong khi có vẻ không hiệu quả. Càng nhiều tự động hóa chúng ta có, càng nhiều thời gian chúng ta có để sửa vấn đề thực khi chúng xảy ra và suy nghĩ cách tự động hóa thậm chí hơn chúng ta đã có."

Bài viết đầu tiên khám phá tại sao shell script là công cụ quan trọng cho sysadmin và cơ bản tạo một script Bash rất đơn giản.

Tại sao tự động hóa? (Why automate?)

Bạn đã bao giờ thực hiện tác vụ dài và phức tạp tại dòng lệnh và nghĩ, "Vui thay đã xong. Giờ tôi không bao giờ phải lo về nó nữa!"? Tác giả có—thường xuyên. Tác giả cuối cùng nhận ra rằng gần như mọi thứ tác giả cần làm trên máy tính (dù của mình hoặc thuộc chủ nhân hoặc khách hàng tư vấn) sẽ cần làm lại vào lúc nào đó trong tương lai.

Tất nhiên, tác giả luôn nghĩ sẽ nhớ cách làm tác vụ. Nhưng, thường thì, lần sau đủ xa trong tương lai mà tác giả quên đã bao giờ làm nó, chứ đừng nói đến cách làm nó. Tác giả bắt đầu viết các bước cần cho một số tác vụ trên mảnh giấy, rồi nghĩ, "Tôi ngu ngốc thế nào!" Vì vậy tác giả chuyển những gribble đó sang ứng dụng notepad đơn giản trên máy tính, cho đến một ngày, tác giả lại nghĩ, "Tôi ngu ngốc thế nào!" Nếu tôi sẽ lưu dữ liệu này trên máy tính, tôi cũng có thể tạo shell script và lưu nó ở vị trí tiêu chuẩn, như /usr/local/bin hoặc ~/bin, để tôi chỉ gõ tên chương trình shell và để nó làm tất cả tác vụ tôi từng làm thủ công.

Đối với tác giả, tự động hóa cũng có nghĩa là không phải nhớ hoặc tái tạo chi tiết cách tác giả thực hiện tác vụ để làm lại nó. Nó tốn thời gian để nhớ cách làm và thời gian gõ tất cả lệnh. Điều này có thể trở thành hố đen thời gian đáng kể cho tác vụ yêu cầu gõ số lượng lớn lệnh dài. Tự động hóa tác vụ bằng cách tạo shell script giảm gõ phím cần thiết để thực hiện tác vụ thường quy.

Shell script (Shell scripts)

Viết chương trình shell—còn gọi là script—là chiến lược tốt nhất để tận dụng thời gian của tác giả. Một khi viết chương trình shell, tác giả có thể chạy lại nó bao nhiêu lần cần. Tác giả cũng có thể cập nhật shell script để bù cho thay đổi từ bản phát hành Linux này sang bản khác, cài phần cứng và phần mềm mới, thay đổi cái tác giả muốn hoặc cần hoàn thành với script, thêm hàm mới, gỡ hàm không còn cần, và sửa bug không quá hiếm trong script. Những loại thay đổi này chỉ là một phần của chu kỳ bảo trì cho bất kỳ loại code nào.

Mọi tác vụ thực hiện qua bàn phím trong session terminal bằng cách nhập và thực thi lệnh shell có thể và nên được tự động hóa. Sysadmin nên tự động hóa mọi thứ chúng ta được yêu cầu làm hoặc quyết định cần làm. Nhiều lần, làm tự động hóa trước tiết kiệm thời gian cho tác giả ngay lần đầu.

Một script Bash có thể chứa từ vài lệnh đến hàng nghìn. Tác giả đã viết script Bash chỉ có một hoặc hai lệnh, và đã viết script với hơn 2.700 dòng, hơn một nửa là comment.

Bắt đầu (Getting started)

Đây là ví dụ tầm thường của shell script và cách tạo nó. Trong chuỗi trước về lập trình dòng lệnh Bash, tác giả dùng ví dụ từ mọi sách lập trình từng đọc: "Hello world." Từ dòng lệnh, nó trông như thế này:

[student@testvm1 ~]$ echo "Hello world"
Hello world

Theo định nghĩa, một chương trình hoặc shell script là chuỗi hướng dẫn cho máy tính thực thi. Nhưng gõ chúng vào dòng lệnh mỗi lần khá nhàm chán, đặc biệt khi chương trình dài và phức tạp. Lưu chúng trong file có thể thực thi bằng một lệnh đơn lẻ tiết kiệm thời gian và giảm khả năng lỗi lọt vào.

Tác giả khuyên thử các ví dụ sau作为 non-root user trên hệ thống test hoặc máy ảo (VM). Mặc dù ví dụ vô hại, lỗi có thể xảy ra, và an toàn luôn khôn ngoan.

Nhiệm vụ đầu tiên là tạo file chứa chương trình. Dùng lệnh touch tạo file rỗng, hello, sau đó làm cho nó thực thi:

[student@testvm1 ~]$ touch hello
[student@testvm1 ~]$ chmod 774 hello

Bây giờ, dùng trình soạn thảo yêu thích để thêm dòng sau vào file:

echo "Hello world"

Lưu file và chạy từ dòng lệnh. Bạn có thể dùng session shell riêng để thực thi script trong chuỗi này:

[student@testvm1 ~]$ ./hello 
Hello world!

Đây là chương trình Bash đơn giản nhất bạn có thể tạo—một câu lệnh đơn trong file. Cho bài tập này, script shell hoàn chỉnh của bạn sẽ được xây dựng quanh câu lệnh Bash đơn giản này. Chức năng của chương trình không quan trọng cho mục đích này, và câu lệnh đơn giản này cho phép bạn xây dựng cấu trúc chương trình—template cho các chương trình khác—mà không lo về logic của mục đích chức năng. Bạn có thể tập trung vào cấu trúc chương trình cơ bản và tạo template theo cách rất đơn giản, và bạn có thể tạo và test bản thân template thay vì chương trình chức năng phức tạp.

Shebang

Câu lệnh đơn lẻ hoạt động tốt miễn bạn dùng Bash hoặc shell tương thích với lệnh dùng trong script. Nếu không shell nào được chỉ định trong script, shell mặc định sẽ dùng để thực thi lệnh script.

Nhiệm vụ tiếp theo là đảm bảo script sẽ chạy dùng shell Bash, ngay cả khi shell khác là mặc định. Điều này đạt được với dòng shebang. Shebang là cách geeky mô tả ký tự #! chỉ định rõ shell nào dùng khi chạy script. Trong trường hợp này, đó là Bash, nhưng có thể là bất kỳ shell nào khác. Nếu shell chỉ định không cài đặt, script sẽ không chạy.

Thêm dòng shebang như dòng đầu của script, nên giờ nó trông như thế này:

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

Chạy script lại—bạn nên không thấy khác biệt trong kết quả. Nếu bạn có shell khác cài đặt (như ksh, csh, tcsh, zsh, v.v.), khởi động một và chạy script lại.

Script vs. chương trình biên dịch (Scripts vs. compiled programs)

Khi viết chương trình để tự động hóa—tốt, mọi thứ—sysadmin nên luôn dùng shell script. Vì shell script được lưu ở định dạng ASCII text, chúng có thể xem và sửa đổi bởi con người dễ dàng như máy tính. Bạn có thể kiểm tra chương trình shell và thấy chính xác nó làm gì và có lỗi rõ ràng trong cú pháp hay logic không. Đây là ví dụ mạnh mẽ của ý nghĩa là mở.

Tác giả biết một số developer coi shell script là thứ gì đó kém hơn lập trình "thực". Việc coi thường shell script và người viết chúng dường như dựa trên ý tưởng rằng ngôn ngữ lập trình "thực" duy nhất là ngôn ngữ phải biên dịch từ mã nguồn để tạo mã thực thi. Tác giả có thể nói từ kinh nghiệm rằng điều này hoàn toàn sai.

Tác giả đã dùng nhiều ngôn ngữ, bao gồm BASIC, C, C++, Pascal, Perl, Tcl/Expect, REXX (và một số biến thể, bao gồm Object REXX), nhiều ngôn ngữ shell (bao gồm Korn, csh và Bash), và thậm chí một số assembly language. Mọi ngôn ngữ máy tính từng được thiết kế đều có một mục đích: cho phép con người nói với máy tính làm gì. Khi bạn viết chương trình, bất kể ngôn ngữ bạn chọn, bạn đang đưa ra hướng dẫn cho máy tính thực hiện tác vụ cụ thể theo trình tự cụ thể.

Script có thể viết và test nhanh hơn nhiều so với ngôn ngữ biên dịch. Chương trình thường phải viết nhanh để đáp ứng ràng buộc thời gian do hoàn cảnh hoặc sếp tóc xù. Hầu hết script sysadmin viết là để sửa vấn đề, dọn dẹp hậu quả vấn đề, hoặc giao chương trình phải hoạt động lâu trước khi chương trình biên dịch có thể viết và test.

Viết chương trình nhanh yêu cầu lập trình shell vì nó cho phép phản ứng nhanh với nhu cầu khách hàng—dù đó là bạn hoặc người khác. Nếu có vấn đề với logic hoặc bug trong code, chúng có thể sửa và test lại gần như ngay lập tức. Nếu tập yêu cầu ban đầu bị lỗi hoặc không hoàn chỉnh, shell script có thể thay đổi rất nhanh để đáp ứng yêu cầu mới. Nói chung, nhu cầu tốc độ phát triển trong công việc sysadmin ghi đè nhu cầu làm chương trình chạy nhanh nhất có thể hoặc dùng ít tài nguyên hệ thống như RAM.

Hầu hết việc sysadmin làm tốn thời gian để tìm ra cách làm hơn là thực thi. Do đó, có vẻ phản tác dụng tạo shell script cho mọi thứ bạn làm. Nó tốn thời gian viết script và làm chúng thành công cụ tạo kết quả có thể tái tạo và dùng bao nhiêu lần cần. Sự tiết kiệm thời gian đến mỗi lần bạn chạy script mà không phải tìm ra (lại) cách làm tác vụ.

Suy nghĩ cuối (Final thoughts)

Bài viết này không đi xa trong việc tạo shell script, nhưng nó tạo một cái rất nhỏ. Nó cũng khám phá lý do tạo shell script và tại sao chúng là lựa chọn hiệu quả nhất cho system administrator (thay vì chương trình biên dịch).

Trong bài viết tiếp theo, bạn sẽ bắt đầu tạo template Bash script có thể dùng như điểm khởi đầu cho các script Bash khác. Template cuối cùng sẽ chứa cơ sở Help, tuyên bố cấp phép GNU, một số hàm đơn giản, và logic xử lý các tùy chọn đó, cũng như những cái khác có thể cần cho các script dựa trên template này.

Tài nguyên (Resources)

  • Cách lập trình với Bash: Cú pháp và công cụ
  • Cách lập trình với Bash: Toán tử logic và mở rộng shell
  • Cách lập trình với Bash: Vòng lặp

Chuỗi bài viết này một phần dựa trên Volume 2, Chapter 10 của khóa tự học Linux ba phần của David Both, Using and Administering Linux—Zero to SysAdmin.