Trong bài đầu tiên của loạt bài này, bạn đã tạo một tập lệnh Bash rất nhỏ, một dòng và 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 thứ hai, bạn đã bắt đầu nhiệm vụ tạo một mẫu khá đơn giản mà bạn có thể sử dụng làm điểm khởi đầu cho các chương trình Bash khác, sau đó khám phá các cách để kiểm tra nó.
Phần ba trong số bốn bài trong loạt bài này giải thích cách tạo và sử dụng một hàm Trợ giúp đơn giản. Trong khi tạo cơ sở Trợ giúp của mình, bạn cũng sẽ tìm hiểu về cách sử dụng các hàm và cách xử lý các tùy chọn dòng lệnh, chẳng hạn như -h .
Tại sao lại Trợ giúp?
Ngay cả các chương trình Bash khá đơn giản cũng nên có một số loại phương tiện Trợ giúp, ngay cả khi nó khá thô sơ. Nhiều chương trình Bash shell mà tôi viết được sử dụng không thường xuyên đến nỗi tôi quên mất cú pháp chính xác của lệnh mà tôi cần. Những thứ khác phức tạp đến mức tôi cần phải xem lại các tùy chọn và đối số ngay cả khi tôi sử dụng chúng thường xuyên.
Có chức năng Trợ giúp tích hợp cho phép bạn xem những thứ đó mà không cần phải kiểm tra mã. Cơ sở trợ giúp tốt và đầy đủ cũng là một phần của tài liệu chương trình.
Giới thiệu về chức năng
Các hàm Shell là danh sách các câu lệnh của chương trình Bash được lưu trữ trong môi trường của shell và có thể được thực thi, giống như bất kỳ lệnh nào khác, bằng cách gõ tên của chúng vào dòng lệnh. Các hàm shell cũng có thể được gọi là các thủ tục hoặc chương trình con, tùy thuộc vào ngôn ngữ lập trình khác mà bạn đang sử dụng.
Các hàm được gọi trong tập lệnh hoặc từ giao diện dòng lệnh (CLI) bằng cách sử dụng tên của chúng, giống như cách bạn làm đối với bất kỳ lệnh nào khác. Trong một chương trình CLI hoặc một tập lệnh, các lệnh trong hàm thực thi khi chúng được gọi, sau đó chuỗi dòng chương trình quay trở lại thực thể đang gọi và chuỗi câu lệnh chương trình tiếp theo trong thực thể đó sẽ thực thi.
Cú pháp của một hàm là:
FunctionName(){program statements}
Khám phá điều này bằng cách tạo một hàm đơn giản tại CLI. (Hàm được lưu trữ trong môi trường shell cho phiên bản shell mà nó được tạo.) Bạn sẽ tạo một hàm có tên hw , là viết tắt của "hello world". Nhập mã sau vào CLI và nhấn Enter . Sau đó, nhập hw như bạn làm với bất kỳ lệnh shell nào khác:
[student@testvm1 ~]$ hw(){ echo "Hi there kiddo"; }
[student@testvm1 ~]$ hw
Hi there kiddo
[student@testvm1 ~]$
OK, vì vậy tôi hơi mệt mỏi với phần khởi động "Hello world" tiêu chuẩn. Bây giờ, hãy liệt kê tất cả các chức năng hiện được xác định. Có rất nhiều người trong số họ, vì vậy tôi chỉ hiển thị hw mới hàm số. Khi nó được gọi từ dòng lệnh hoặc trong một chương trình, một hàm thực hiện tác vụ được lập trình của nó, sau đó thoát và trả lại quyền điều khiển cho thực thể gọi, dòng lệnh hoặc câu lệnh chương trình Bash tiếp theo trong một tập lệnh sau câu lệnh gọi:
[student@testvm1 ~]$ declare -f | less
<snip>
hw ()
{
echo "Hi there kiddo"
}
<snip>
Loại bỏ chức năng đó vì bạn không cần nó nữa. Bạn có thể làm điều đó với unset lệnh:
[student@testvm1 ~]$ unset -f hw ; hw
bash: hw: command not found
[student@testvm1 ~]$
Tạo chức năng Trợ giúp
Mở xin chào chương trình trong trình chỉnh sửa và thêm chức năng Trợ giúp bên dưới vào xin chào mã chương trình sau tuyên bố bản quyền nhưng trước echo "Hello world!" bản tường trình. Chức năng Trợ giúp này sẽ hiển thị mô tả ngắn về chương trình, sơ đồ cú pháp và mô tả ngắn về các tùy chọn có sẵn. Thêm lệnh gọi vào chức năng Trợ giúp để kiểm tra nó và một số dòng nhận xét cung cấp sự phân chia trực quan giữa các chức năng và phần chính của chương trình:
################################################################################
# Help #
################################################################################
Help()
{
# Display Help
echo "Add description of the script functions here."
echo
echo "Syntax: scriptTemplate [-g|h|v|V]"
echo "options:"
echo "g Print the GPL license notification."
echo "h Print this Help."
echo "v Verbose mode."
echo "V Print software version and exit."
echo
}
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
Help
echo "Hello world!"
Các tùy chọn được mô tả trong chức năng Trợ giúp này là điển hình cho các chương trình tôi viết, mặc dù chưa có trong mã. Chạy chương trình để kiểm tra nó:
[student@testvm1 ~]$ ./hello
Add description of the script functions here.
Syntax: scriptTemplate [-g|h|v|V]
options:
g Print the GPL license notification.
h Print this Help.
v Verbose mode.
V Print software version and exit.
Hello world!
[student@testvm1 ~]$
Vì bạn chưa thêm bất kỳ logic nào để chỉ hiển thị Trợ giúp khi bạn cần, nên chương trình sẽ luôn hiển thị Trợ giúp. Vì chức năng đang hoạt động chính xác, hãy đọc để thêm một số logic để hiển thị Trợ giúp chỉ khi -h tùy chọn được sử dụng khi bạn gọi chương trình tại dòng lệnh.
Các tùy chọn xử lý
Khả năng của tập lệnh Bash để xử lý các tùy chọn dòng lệnh như -h cung cấp một số khả năng mạnh mẽ để chỉ đạo chương trình và sửa đổi những gì nó thực hiện. Trong trường hợp của -h tùy chọn, bạn muốn chương trình in văn bản Trợ giúp đến phiên đầu cuối và sau đó thoát mà không chạy phần còn lại của chương trình. Khả năng xử lý các tùy chọn đã nhập tại dòng lệnh có thể được thêm vào tập lệnh Bash bằng cách sử dụng while lệnh (xem Cách lập trình với Bash:Loops để tìm hiểu thêm về while ) kết hợp với getops và trường hợp lệnh.
điểm dừng lệnh đọc bất kỳ và tất cả các tùy chọn được chỉ định tại dòng lệnh và tạo danh sách các tùy chọn đó. Trong mã bên dưới, while lệnh lặp qua danh sách các tùy chọn bằng cách đặt biến $ options cho mỗi. trường hợp câu lệnh dùng để đánh giá lần lượt từng phương án và thực hiện các câu lệnh trong khổ thơ tương ứng. Trong khi câu lệnh sẽ tiếp tục đánh giá danh sách các tùy chọn cho đến khi tất cả chúng đã được xử lý hoặc nó gặp phải câu lệnh thoát, điều này sẽ kết thúc chương trình.
Đảm bảo xóa lệnh gọi chức năng Trợ giúp ngay trước tiếng vọng "Hello world!" sao cho phần nội dung chính của chương trình bây giờ trông giống như sau:
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# Process the input options. Add options as needed. #
################################################################################
# Get the options
while getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
esac
done
echo "Hello world!"
Lưu ý dấu chấm phẩy kép ở cuối câu lệnh thoát trong tùy chọn trường hợp cho -h . Điều này là bắt buộc đối với mỗi tùy chọn được thêm vào câu lệnh trường hợp này để xác định phần cuối của mỗi tùy chọn.
Kiểm tra
Kiểm tra bây giờ phức tạp hơn một chút. Bạn cần kiểm tra chương trình của mình với một số tùy chọn khác nhau — và không có tùy chọn nào — để xem nó phản hồi như thế nào. Đầu tiên, hãy kiểm tra không có tùy chọn nào để đảm bảo rằng nó in "Hello world!" như nó nên:
[student@testvm1 ~]$ ./hello
Hello world!
Điều đó hoạt động, vì vậy bây giờ hãy kiểm tra logic hiển thị văn bản Trợ giúp:
[student@testvm1 ~]$ ./hello -h
Add description of the script functions here.
Syntax: scriptTemplate [-g|h|t|v|V]
options:
g Print the GPL license notification.
h Print this Help.
v Verbose mode.
V Print software version and exit.
Điều đó hoạt động như mong đợi, vì vậy hãy thử một số thử nghiệm để xem điều gì sẽ xảy ra khi bạn nhập một số tùy chọn không mong muốn:
[student@testvm1 ~]$ ./hello -x
Hello world!
[student@testvm1 ~]$ ./hello -q
Hello world!
[student@testvm1 ~]$ ./hello -lkjsahdf
Add description of the script functions here.
Syntax: scriptTemplate [-g|h|t|v|V]
options:
g Print the GPL license notification.
h Print this Help.
v Verbose mode.
V Print software version and exit.
[student@testvm1 ~]$
Chương trình chỉ bỏ qua bất kỳ tùy chọn nào mà không có phản hồi cụ thể mà không tạo ra bất kỳ lỗi nào. Nhưng hãy lưu ý mục nhập cuối cùng (với -lkjsahdf cho các tùy chọn):vì có một h trong danh sách các tùy chọn, chương trình nhận ra nó và in văn bản Trợ giúp. Thử nghiệm này đã chỉ ra rằng chương trình không có khả năng xử lý đầu vào không chính xác và chấm dứt chương trình nếu phát hiện có bất kỳ điều gì.
Bạn có thể thêm một khổ thơ khác vào câu lệnh để khớp với bất kỳ tùy chọn nào không có kết quả khớp rõ ràng. Trường hợp chung này sẽ khớp với bất kỳ thứ gì bạn chưa cung cấp kết quả phù hợp cụ thể. Câu lệnh trường hợp bây giờ trông giống như thế này, với kết quả khớp toàn bộ là \? như trường hợp cuối cùng. Mọi trường hợp cụ thể bổ sung phải đặt trước trường hợp cuối cùng này:
Tùy chọnwhile getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
\?) # incorrect option
echo "Error: Invalid option"
exit;;
esac
done
Kiểm tra lại chương trình bằng cách sử dụng các tùy chọn giống như trước đây và xem nó hoạt động như thế nào ngay bây giờ.
Bạn đang ở đâu
Bạn đã hoàn thành rất tốt trong bài viết này bằng cách thêm khả năng xử lý các tùy chọn dòng lệnh và thủ tục Trợ giúp. Tập lệnh Bash của bạn bây giờ trông giống như sau:
#!/usr/bin/bash
################################################################################
# scriptTemplate #
# #
# Use this template as the beginning of a new program. Place a short #
# description of the script here. #
# #
# Change History #
# 11/11/2019 David Both Original code. This is a template for creating #
# new Bash shell scripts. #
# Add new history entries as needed. #
# #
# #
################################################################################
################################################################################
################################################################################
# #
# Copyright (C) 2007, 2019 David Both #
# [email protected] #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
################################################################################
################################################################################
################################################################################
################################################################################
# Help #
################################################################################
Help()
{
# Display Help
echo "Add description of the script functions here."
echo
echo "Syntax: scriptTemplate [-g|h|t|v|V]"
echo "options:"
echo "g Print the GPL license notification."
echo "h Print this Help."
echo "v Verbose mode."
echo "V Print software version and exit."
echo
}
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# Process the input options. Add options as needed. #
################################################################################
# Get the options
while getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
\?) # incorrect option
echo "Error: Invalid option"
exit;;
esac
done
echo "Hello world!"
Hãy chắc chắn để kiểm tra phiên bản này của chương trình rất kỹ lưỡng. Sử dụng đầu vào ngẫu nhiên và xem điều gì sẽ xảy ra. Bạn cũng nên thử kiểm tra các tùy chọn hợp lệ và không hợp lệ mà không sử dụng dấu gạch ngang ( - ) ở phía trước.
Lần tới
Trong bài viết này, bạn đã thêm chức năng Trợ giúp cũng như khả năng xử lý các tùy chọn dòng lệnh để hiển thị nó một cách chọn lọc. Chương trình ngày càng phức tạp hơn một chút, vì vậy việc thử nghiệm ngày càng trở nên quan trọng hơn và yêu cầu nhiều đường dẫn thử nghiệm hơn để hoàn thiện.
Bài tiếp theo sẽ xem xét việc khởi tạo các biến và thực hiện một chút kiểm tra sự tỉnh táo để đảm bảo rằng chương trình sẽ chạy theo bộ điều kiện chính xác.
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.