Trong bài viết đầu tiên trong chuỗi này, bạn tạo script Bash đầu tiên, rất nhỏ, một dòng, và khám phá lý do tạo shell script. Trong bài thứ hai, bạn bắt đầu tạo một template khá đơn giản có thể là điểm khởi đầu cho các chương trình Bash khác và bắt đầu test nó. Trong bài thứ ba, bạn tạo và dùng một hàm Help đơn giản và học về dùng hàm và cách xử lý tùy chọn dòng lệnh như -h.
Bài viết thứ tư và cuối cùng trong chuỗi này đi sâu vào biến và khởi tạo chúng cũng như cách làm một chút sanity testing để giúp đảm bảo chương trình chạy dưới điều kiện đúng. Nhớ rằng, mục tiêu của chuỗi này là xây dựng code hoạt động sẽ được dùng như template cho các dự án lập trình Bash tương lai. Ý tưởng là làm cho việc bắt đầu dự án lập trình mới dễ dàng bằng cách có các yếu tố chung đã sẵn sàng trong template.
Biến (Variables)
Shell Bash, giống như mọi ngôn ngữ lập trình, có thể xử lý biến. Biến là tên tượng trưng tham chiếu đến vị trí bộ nhớ cụ thể chứa giá trị nào đó. Giá trị của biến có thể thay đổi, tức là nó biến đổi. Nếu bạn không quen dùng biến, hãy đọc bài viết Cách lập trình với Bash: Cú pháp và công cụ trước khi đi tiếp.
Xong? Tuyệt! Hãy xem một số thói quen tốt khi dùng biến.
Tác giả luôn thiết lập giá trị ban đầu cho mọi biến dùng trong script. Bạn có thể tìm thấy điều này trong template script ngay sau các thủ tục như phần đầu tiên của thân chương trình chính, trước khi nó xử lý các tùy chọn. Khởi tạo mỗi biến với giá trị thích hợp có thể ngăn lỗi có thể xảy ra với biến chưa khởi tạo trong so sánh hoặc phép toán. Đặt danh sách biến này ở một nơi cho phép bạn thấy tất cả biến nên có trong script và giá trị ban đầu của chúng.
Script nhỏ của bạn chỉ có một biến duy nhất, $option, cho đến nay. Thiết lập nó bằng cách chèn các dòng sau như hiển thị:
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
# Initialize variables
option=""
################################################################################
# Process the input options. Add options as needed. #
################################################################################
Test điều này để đảm bảo mọi thứ hoạt động như nó nên và không có gì bị hỏng do thay đổi này.
Hằng số (Constants)
Hằng số cũng là biến—ít nhất chúng nên là như vậy. Dùng biến bất cứ nơi nào có thể trong chương trình giao diện dòng lệnh (CLI) thay vì giá trị hard-coded. Ngay cả khi bạn nghĩ bạn sẽ dùng một giá trị cụ thể (như tên thư mục, tên file, hoặc chuỗi văn bản) chỉ một lần, hãy tạo biến và dùng nó nơi bạn đã đặt tên hard-coded.
Ví dụ, thông báo in như một phần của thân chương trình chính là chuỗi literal, echo "Hello world!". Thay đổi đó thành biến. Trước hết, thêm câu lệnh sau vào phần khởi tạo biến:
Msg="Hello world!"
Và bây giờ thay đổi dòng cuối của chương trình từ:
echo "Hello world!"
thành:
echo "$Msg"
Test kết quả.
Kiểm tra Sanity (Sanity checks)
Kiểm tra Sanity đơn giản là test cho các điều kiện cần phải true để chương trình hoạt động đúng, như: chương trình phải chạy作为 root user, hoặc phải chạy trên một distro cụ thể và release của distro đó. Thêm kiểm tra root làm user chạy trong chương trình template đơn giản của bạn.
Kiểm tra user root chạy chương trình dễ dàng vì chương trình chạy作为 user khởi chạy nó.
Lệnh id có thể dùng để xác định numeric user ID (UID) chương trình đang chạy dưới. Nó cung cấp một vài thông tin khi dùng không có tùy chọn:
[student@testvm1 ~]$ id
uid=1001(student) gid=1001(student) groups=1001(student),5000(dev)
Dùng tùy chọn -u chỉ trả về UID của user, dễ dùng trong chương trình Bash của bạn:
[student@testvm1 ~]$ id -u
1001
[student@testvm1 ~]$
Thêm hàm sau vào chương trình. Tác giả thêm nó sau thủ tục Help, nhưng bạn có thể đặt nó bất cứ đâu trong phần thủ tục. Logic là nếu UID không phải không, mà luôn luôn là UID của user root, chương trình thoát:
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
Bây giờ, thêm lời gọi thủ tục CheckRoot ngay trước khởi tạo biến. Test điều này, trước tiên chạy chương trình作为 user student:
[student@testvm1 ~]$ ./hello
ERROR: You must be root user to run this program
[student@testvm1 ~]$
sau đó作为 user root:
[root@testvm1 student]# ./hello
Hello world!
[root@testvm1 student]#
Bạn có thể không luôn cần kiểm tra sanity cụ thể này, vì vậy comment out lời gọi CheckRoot nhưng để lại tất cả code trong template. Cách này, tất cả bạn cần làm để dùng code đó trong chương trình tương lai là uncomment lời gọi.
Mã nguồn (The code)
Sau khi làm các thay đổi nêu trên, code của bạn trông như thế này:
#!/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 #
# LinuxGeek46@both.org #
# #
# 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|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
}
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
# If we are not running as root we exit the program
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# Sanity checks #
################################################################################
# Are we rnning as root?
# CheckRoot
# Initialize variables
option=""
Msg="Hello world!"
################################################################################
# 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 "$Msg"
Bài tập cuối (A final exercise)
Bạn có thể nhận ra hàm Help trong code của bạn đề cập đến tính năng không có trong code. Là bài tập cuối, hãy tìm ra cách thêm những hàm đó vào template code bạn tạo.
Tóm tắt (Summary)
Trong bài viết này, bạn tạo một vài hàm để thực hiện kiểm tra sanity xem chương trình có chạy作为 root không. Chương trình của bạn đang hơi phức tạp hơn, nên test đang trở nên quan trọng hơn và yêu cầu nhiều đường dẫn test hơn để hoàn chỉnh.
Chuỗi này xem xét một chương trình Bash tối thiểu và cách xây dựng script lên một chút từng lúc. Kết quả là một template đơn giản có thể là điểm khởi đầu cho các script Bash khác, hữu ích hơn và chứa các yếu tố hữu ích làm cho việc bắt đầu script mới dễ dàng.
Đến đây, bạn đã hiểu ý tưởng: Chương trình biên dịch là cần thiết và đáp ứng nhu cầu rất quan trọng. Nhưng cho sysadmin, luôn có cách tốt hơn. Luôn dùng shell script để đáp ứng nhu cầu tự động hóa công việc. Shell script là mở; nội dung và mục đích của chúng có thể biết. Chúng có thể dễ dàng sửa đổi để đáp ứng yêu cầu khác nhau. Tác giả chưa bao giờ tìm thấy bất cứ thứ gì cần làm trong vai trò sysadmin không thể hoàn thành với shell script.
Điều bạn đã tạo cho đến nay trong chuỗi này chỉ mới là khởi đầu. Khi bạn viết nhiều chương trình Bash hơn, bạn sẽ tìm thấy thêm nhiều đoạn code bạn dùng thường xuyên và nên đưa vào template chương trình của mình.
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.