Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Giới thiệu về tự động hóa với tập lệnh Bash

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

  • Ưu điểm của tự động hóa với các tập lệnh Bash shell
  • Tại sao sử dụng tập lệnh shell là lựa chọn tốt hơn cho sysadmins hơn là các ngôn ngữ đã biên dịch như C hoặc C ++
  • Tạo một tập hợp các yêu cầu cho các tập lệnh mới
  • Tạo các tập lệnh Bash shell đơn giản từ các chương trình giao diện dòng lệnh (CLI)
  • Tăng cường bảo mật thông qua việc sử dụng ID người dùng (UID) chạy tập lệnh
  • Sử dụng các công cụ so sánh logic để cung cấp kiểm soát luồng thực thi cho các chương trình và tập lệnh dòng lệnh
  • Sử dụng các tùy chọn dòng lệnh để kiểm soát chức năng của tập lệnh
  • Tạo các hàm Bash có thể được gọi từ một hoặc nhiều vị trí trong một tập lệnh
  • Tại sao và cách cấp phép mã của bạn làm mã nguồn mở
  • Tạo và triển khai một kế hoạch thử nghiệm đơn giản

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

Tại sao tôi sử dụng tập lệnh shell

Trong Chương 9 của Triết lý Linux cho Sysadmins , Tôi viết:

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

"Sysadmins có năng suất cao nhất tiếp theo khi tạo ra các chương trình shell tự động hóa các giải pháp mà họ đã hình thành trong khi dường như không hiệu quả. Chúng tôi càng thực hiện nhiều tự động, chúng tôi càng có nhiều thời gian để khắc phục các sự cố thực sự khi chúng xảy ra và suy nghĩ về cách để tự động hóa nhiều hơn những gì chúng tôi đã có. "

Bài viết đầu tiên này khám phá lý do tại sao các tập lệnh shell là một công cụ quan trọng cho sysadmin và những điều cơ bản để tạo một tập lệnh Bash rất đơn giản.

Tại sao phải tự động hóa?

Bạn đã bao giờ thực hiện một nhiệm vụ dài và phức tạp ở dòng lệnh và nghĩ, "Rất vui là đã hoàn thành. Bây giờ tôi không bao giờ phải lo lắng về nó nữa!"? Tôi có — thường xuyên. Cuối cùng, tôi nhận ra rằng hầu hết mọi thứ mà tôi cần thực hiện trên máy tính (dù là của tôi hay của một nhà tuyển dụng hay một khách hàng tư vấn) sẽ cần phải được thực hiện lại vào một lúc nào đó trong tương lai.

Tất nhiên, tôi luôn nghĩ rằng tôi sẽ nhớ cách tôi đã thực hiện nhiệm vụ. Nhưng, thường thì, khoảng thời gian tiếp theo đủ xa trong tương lai để tôi quên rằng mình đã từng đã làm xong, hãy để một mình làm thế nào để làm điều đó. Tôi bắt đầu viết ra các bước cần thiết cho một số nhiệm vụ trên một tờ giấy, rồi nghĩ, "Mình thật ngu ngốc làm sao!" Vì vậy, tôi đã chuyển những nét vẽ nguệch ngoạc đó sang một ứng dụng notepad đơn giản trên máy tính của mình, cho đến một ngày, tôi nghĩ lại, "Mình thật ngu ngốc làm sao!" Nếu tôi định lưu trữ dữ liệu này trên máy tính của mình, tôi cũng có thể tạo một tập lệnh shell và lưu trữ nó ở một vị trí chuẩn, như / usr / local / bin hoặc ~ / bin , vì vậy tôi có thể chỉ cần nhập tên của chương trình shell và để nó thực hiện tất cả các tác vụ tôi từng làm theo cách thủ công.

Đối với tôi, tự động hóa cũng có nghĩa là tôi không phải nhớ hoặc tạo lại các chi tiết về cách tôi đã thực hiện nhiệm vụ để thực hiện lại. Cần có thời gian để nhớ cách thực hiện mọi việc và thời gian để gõ tất cả các lệnh. Điều này có thể trở thành khoảng thời gian giảm đáng kể cho các tác vụ yêu cầu nhập số lượng lớn các lệnh dài. Việc tự động hóa các tác vụ bằng cách tạo các tập lệnh shell giúp giảm việc nhập liệu cần thiết để thực hiện các tác vụ thông thường.

Tập lệnh shell

Viết chương trình shell — còn được gọi là script — là chiến lược tốt nhất để tận dụng thời gian của tôi. Khi tôi viết một chương trình shell, tôi có thể chạy lại nó nhiều lần nếu cần. Tôi cũng có thể cập nhật các tập lệnh shell của mình để bù đắp cho những thay đổi từ bản phát hành Linux này sang bản tiếp theo, cài đặt phần cứng và phần mềm mới, thay đổi những gì tôi muốn hoặc cần hoàn thành với tập lệnh, thêm các chức năng mới, xóa các chức năng không còn cần thiết, và sửa các lỗi không hiếm gặp trong các tập lệnh của tôi. 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 mã nào.

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

Một tập lệnh Bash có thể chứa bất kỳ đâu từ một vài lệnh đến hàng nghìn lệnh. Tôi đã viết các tập lệnh Bash chỉ với một hoặc hai lệnh và tôi đã viết một tập lệnh với hơn 2.700 dòng, hơn một nửa trong số đó là lời bình.

Bắt đầu

Đây là một ví dụ đơn giản về shell script và cách tạo nó. Trong loạt bài trước của tôi về lập trình dòng lệnh Bash, tôi đã sử dụng ví dụ từ mọi cuốn sách về lập trình mà tôi từng đọc:"Hello world". Từ dòng lệnh, nó trông giống như sau:

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

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

Tôi khuyên bạn nên thử các ví dụ sau với tư cách là người dùng không phải root trên hệ thống thử nghiệm hoặc máy ảo (VM). Mặc dù các ví dụ là vô hại, nhưng sai lầm vẫn xảy ra và an toàn luôn là điều khôn ngoan.

Nhiệm vụ đầu tiên là tạo một tệp để chứa chương trình của bạn. Sử dụng chạm lệnh để tạo tệp trống, xin chào , sau đó làm cho nó có thể thực thi được:

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

Bây giờ, hãy sử dụng trình chỉnh sửa yêu thích của bạn để thêm dòng sau vào tệp:

echo "Hello world"

Lưu tệp và chạy nó từ dòng lệnh. Bạn có thể sử dụng một phiên shell riêng để thực thi các tập lệnh trong loạt bài này:

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

Đây là chương trình Bash đơn giản nhất mà bạn có thể tạo — một câu lệnh duy nhất trong một tệp. Đối với bài tập này, tập lệnh shell hoàn chỉnh của bạn sẽ được xây dựng xung quanh câu lệnh Bash đơn giản này. Chức năng của chương trình không liên quan 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 — một khuôn mẫu cho các chương trình khác — mà không cần quan tâm đến 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 mẫu của mình theo cách rất đơn giản và bạn có thể tạo và kiểm tra chính mẫu đó chứ không phải là một chương trình chức năng phức tạp.

Shebang

Câu lệnh đơn hoạt động tốt miễn là bạn sử dụng Bash hoặc một trình bao tương thích với các lệnh được sử dụng trong tập lệnh. Nếu không có trình bao nào được chỉ định trong tập lệnh, thì trình bao mặc định sẽ được sử dụng để thực thi các lệnh tập lệnh.

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

Thêm dòng shebang làm dòng đầu tiên của script, vì vậy bây giờ nó trông giống như sau:

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

Chạy lại tập lệnh — bạn sẽ không thấy sự khác biệt trong kết quả. Nếu bạn đã cài đặt các trình bao khác (chẳng hạn như ksh, csh, tcsh, zsh, v.v.), hãy bắt đầu một trình bao và chạy lại tập lệnh.

Tập lệnh so với chương trình đã biên dịch

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

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

Tôi đã sử 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ể của nó, 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ố hợp ngữ ngôn ngữ. Mọi ngôn ngữ máy tính từng được tạo ra đều có một mục đích:cho phép con người ra lệnh cho máy tính phải làm gì. Khi bạn viết một chương trình, bất kể ngôn ngữ bạn chọn là gì, bạn đang cung cấp cho máy tính các hướng dẫn để thực hiện các tác vụ cụ thể theo một trình tự cụ thể.

Tập lệnh có thể được viết và kiểm tra nhanh hơn nhiều so với các ngôn ngữ biên dịch. Các chương trình thường phải được viết nhanh chóng để đáp ứng các hạn chế về thời gian do hoàn cảnh hoặc ông chủ đầu bù tóc rối. Hầu hết các tập lệnh mà sysadmins viết là để khắc phục sự cố, dọn dẹp hậu quả của sự cố hoặc để cung cấp một chương trình phải hoạt động lâu trước khi chương trình đã biên dịch có thể được viết và thử nghiệm.

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

Hầu hết mọi thứ mà sysadmins làm mất nhiều thời gian hơn để tìm ra cách làm hơn là thực thi. Vì vậy, nó có vẻ phản tác dụng khi tạo các tập lệnh shell cho mọi thứ bạn làm. Cần một chút thời gian để viết các tập lệnh và biến chúng thành các công cụ tạo ra các kết quả có thể lặp lại và có thể được sử dụng nhiều lần nếu cần. Tiết kiệm thời gian mỗi khi bạn có thể chạy tập lệnh mà không cần phải tìm ra (một lần nữa) cách thực hiện tác vụ.

Suy nghĩ cuối cùng

Bài viết này không đi sâu vào việc tạo một tập lệnh shell, nhưng nó đã tạo ra một tập lệnh rất nhỏ. Nó cũng khám phá lý do tạo các tập lệnh shell và tại sao chúng là lựa chọn hiệu quả nhất cho người quản trị hệ thống (thay vì các chương trình đã biên dịch).

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

Tài nguyên

  • 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:Loops

Loạt bài viết này một phần dựa trên Tập 2, Chương 10 của khóa học tự học Linux ba phần của David Cả hai, Sử dụng và Quản trị Linux — Zero to SysAdmin.