ในบทความแรกในชุดนี้ คุณได้สร้างสคริปต์ Bash แบบบรรทัดเดียวขนาดเล็กมาก และสำรวจสาเหตุของการสร้างเชลล์สคริปต์ ในบทความที่สอง คุณเริ่มสร้างเทมเพลตที่ค่อนข้างง่ายซึ่งสามารถเป็นจุดเริ่มต้นสำหรับโปรแกรม Bash อื่นๆ และเริ่มทดสอบ ในบทความที่ 3 คุณได้สร้างและใช้ฟังก์ชัน Help อย่างง่าย และเรียนรู้เกี่ยวกับการใช้ฟังก์ชันและวิธีจัดการกับตัวเลือกบรรทัดคำสั่ง เช่น -h .
บทความที่สี่และเป็นบทความสุดท้ายในซีรีส์นี้จะกล่าวถึงตัวแปรและการเริ่มต้นใช้งาน ตลอดจนวิธีทดสอบสุขภาพจิตเล็กน้อย เพื่อช่วยให้มั่นใจว่าโปรแกรมทำงานภายใต้สภาวะที่เหมาะสม โปรดจำไว้ว่า วัตถุประสงค์ของซีรีส์นี้คือการสร้างโค้ดการทำงานที่จะใช้สำหรับเทมเพลตสำหรับโปรเจ็กต์การเขียนโปรแกรม Bash ในอนาคต แนวคิดคือทำให้การเริ่มต้นโครงการการเขียนโปรแกรมใหม่เป็นเรื่องง่ายโดยมีองค์ประกอบทั่วไปอยู่ในเทมเพลต
ตัวแปร
เชลล์ Bash ก็เหมือนกับภาษาโปรแกรมทั้งหมด สามารถจัดการกับตัวแปรได้ ตัวแปรคือชื่อเชิงสัญลักษณ์ที่อ้างถึงตำแหน่งเฉพาะในหน่วยความจำที่มีค่าบางประเภท ค่าของตัวแปรสามารถเปลี่ยนแปลงได้ กล่าวคือ เป็นตัวแปร หากคุณไม่คุ้นเคยกับการใช้ตัวแปร อ่านบทความของฉัน วิธีตั้งโปรแกรมด้วย Bash:ไวยากรณ์และเครื่องมือ ก่อนจะไปต่อ
เสร็จแล้ว? ยอดเยี่ยม! ตอนนี้เรามาดูแนวทางปฏิบัติที่ดีในการใช้ตัวแปรกัน
ฉันตั้งค่าเริ่มต้นสำหรับทุกตัวแปรที่ใช้ในสคริปต์ของฉันเสมอ คุณจะพบสิ่งนี้ได้ในสคริปต์เทมเพลตของคุณทันทีหลังจากขั้นตอนต่างๆ ซึ่งเป็นส่วนหนึ่งของเนื้อหาหลักของโปรแกรม ก่อนประมวลผลตัวเลือกต่างๆ การเริ่มต้นตัวแปรแต่ละตัวด้วยค่าที่เหมาะสมสามารถป้องกันข้อผิดพลาดที่อาจเกิดขึ้นกับตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นในการเปรียบเทียบหรือการดำเนินการทางคณิตศาสตร์ การวางรายการตัวแปรนี้ไว้ในที่เดียวจะทำให้คุณเห็นตัวแปรทั้งหมดที่ควรจะอยู่ในสคริปต์และค่าเริ่มต้นของตัวแปรเหล่านี้
สคริปต์เล็กๆ ของคุณมีตัวแปรเพียงตัวเดียว $option จนถึงตอนนี้ ตั้งค่าโดยการแทรกบรรทัดต่อไปนี้ตามที่แสดง:
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
# Initialize variables
option=""
################################################################################
# Process the input options. Add options as needed. #
################################################################################
ทดสอบสิ่งนี้เพื่อให้แน่ใจว่าทุกอย่างทำงานตามปกติและไม่มีอะไรเสียหายอันเป็นผลมาจากการเปลี่ยนแปลงนี้
ค่าคงที่
ค่าคงที่ก็เป็นตัวแปรเช่นกัน อย่างน้อยก็ควรเป็นเช่นนั้น ใช้ตัวแปรทุกครั้งที่ทำได้ในโปรแกรม command-line interface (CLI) แทนค่าฮาร์ดโค้ด แม้ว่าคุณจะคิดว่าจะใช้ค่าใดค่าหนึ่ง (เช่น ชื่อไดเร็กทอรี ชื่อไฟล์ หรือสตริงข้อความ) เพียงครั้งเดียว ให้สร้างตัวแปรและใช้ค่านั้นในตำแหน่งที่คุณจะใส่ชื่อแบบกำหนดค่าตายตัว
ตัวอย่างเช่น ข้อความที่พิมพ์เป็นส่วนหนึ่งของเนื้อหาหลักของโปรแกรมคือตัวอักษรสตริง echo "Hello world!" . เปลี่ยนสิ่งนั้นเป็นตัวแปร ขั้นแรก เพิ่มคำสั่งต่อไปนี้ในส่วนการเริ่มต้นตัวแปร:
Msg="Hello world!"
และตอนนี้เปลี่ยนบรรทัดสุดท้ายของโปรแกรมจาก:
echo "Hello world!"
ถึง:
echo "$Msg"
ทดสอบผลลัพธ์
การตรวจสุขภาพ
การตรวจสอบความปกติเป็นเพียงการทดสอบเงื่อนไขที่จำเป็นต้องเป็นจริงเพื่อให้โปรแกรมทำงานได้อย่างถูกต้อง เช่น:โปรแกรมต้องรันในฐานะผู้ใช้รูท หรือต้องรันบนการกระจายและการเปิดตัวของ distro นั้นโดยเฉพาะ เพิ่มการตรวจสอบสำหรับ root ในฐานะผู้ใช้ที่กำลังทำงานอยู่ในเทมเพลตโปรแกรมอย่างง่ายของคุณ
การทดสอบว่าผู้ใช้รูทกำลังเรียกใช้โปรแกรมนั้นง่ายเพราะโปรแกรมทำงานในฐานะผู้ใช้ที่เปิดใช้งานโปรแกรม
รหัส คำสั่งสามารถใช้เพื่อกำหนด ID ผู้ใช้ที่เป็นตัวเลข (UID) ที่โปรแกรมกำลังทำงานอยู่ ข้อมูลนี้จะให้ข้อมูลจำนวนเล็กน้อยเมื่อใช้โดยไม่มีตัวเลือก:
[student@testvm1 ~]$ id
uid=1001(student) gid=1001(student) groups=1001(student),5000(dev)
การใช้ -u ตัวเลือกส่งคืนเฉพาะ UID ของผู้ใช้ ซึ่งใช้งานได้ง่ายในโปรแกรม Bash ของคุณ:
[student@testvm1 ~]$ id -u
1001
[student@testvm1 ~]$
เพิ่มฟังก์ชันต่อไปนี้ลงในโปรแกรม ฉันเพิ่มมันหลังจากขั้นตอนวิธีใช้ แต่คุณสามารถวางไว้ที่ใดก็ได้ในส่วนขั้นตอน ตรรกะก็คือถ้า UID ไม่ใช่ศูนย์ ซึ่งเป็น UID ของผู้ใช้รูทเสมอ โปรแกรมจะออก:
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
ตอนนี้ เพิ่มการโทรไปที่ CheckRoot ขั้นตอนก่อนการเริ่มต้นของตัวแปร ทดสอบสิ่งนี้ ขั้นแรกให้รันโปรแกรมในฐานะผู้ใช้ที่เป็นนักเรียน:
[student@testvm1 ~]$ ./hello
ERROR: You must be root user to run this program
[student@testvm1 ~]$
จากนั้นในฐานะผู้ใช้รูท:
[root@testvm1 student]# ./hello
Hello world!
[root@testvm1 student]#
คุณอาจไม่จำเป็นต้องทำการทดสอบสุขภาพจิตนี้เสมอไป ดังนั้นแสดงความคิดเห็นในการเรียกร้องให้ CheckRoot แต่ปล่อยให้โค้ดทั้งหมดอยู่ในเทมเพลต ด้วยวิธีนี้ สิ่งที่คุณต้องทำเพื่อใช้รหัสนั้นในโปรแกรมในอนาคตคือยกเลิกการใส่เครื่องหมายในการโทร
รหัส
หลังจากทำการเปลี่ยนแปลงที่ระบุไว้ข้างต้นแล้ว โค้ดของคุณควรมีลักษณะดังนี้:
#!/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|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"
การออกกำลังกายขั้นสุดท้าย
คุณอาจสังเกตเห็นว่าฟังก์ชันวิธีใช้ในโค้ดของคุณหมายถึงคุณลักษณะที่ไม่ได้อยู่ในโค้ด ในแบบฝึกหัดสุดท้าย ให้หาวิธีเพิ่มฟังก์ชันเหล่านั้นลงในเทมเพลตโค้ดที่คุณสร้างขึ้น
สรุป
ในบทความนี้ คุณได้สร้างฟังก์ชันสองสามอย่างเพื่อทำการทดสอบสติว่าโปรแกรมของคุณทำงานเป็นรูทหรือไม่ โปรแกรมของคุณเริ่มซับซ้อนขึ้นเล็กน้อย การทดสอบจึงมีความสำคัญมากขึ้นและต้องใช้เส้นทางการทดสอบมากขึ้นจึงจะเสร็จสมบูรณ์
ชุดนี้กล่าวถึงโปรแกรม Bash ที่น้อยมาก และวิธีการสร้างสคริปต์ทีละน้อย ผลลัพธ์ที่ได้คือเทมเพลตอย่างง่ายที่สามารถเป็นจุดเริ่มต้นสำหรับสคริปต์ Bash อื่นๆ ที่มีประโยชน์มากกว่า และมีองค์ประกอบที่มีประโยชน์ที่ทำให้ง่ายต่อการเริ่มสคริปต์ใหม่
ถึงตอนนี้ คุณคงเข้าใจแล้วว่า โปรแกรมที่คอมไพล์มีความจำเป็นและเติมเต็มความต้องการที่สำคัญมาก แต่สำหรับผู้ดูแลระบบ ย่อมมีวิธีที่ดีกว่าเสมอ ใช้เชลล์สคริปต์เสมอเพื่อให้ตรงกับความต้องการอัตโนมัติของงานของคุณ เชลล์สคริปต์เปิดอยู่ เนื้อหาและวัตถุประสงค์เป็นที่ทราบ สามารถปรับเปลี่ยนได้ง่ายเพื่อตอบสนองความต้องการที่แตกต่างกัน ฉันไม่เคยพบสิ่งใดที่ต้องทำในบทบาทผู้ดูแลระบบที่ไม่สามารถทำได้ด้วยเชลล์สคริปต์
สิ่งที่คุณสร้างขึ้นในซีรีส์นี้เป็นเพียงจุดเริ่มต้นเท่านั้น เมื่อคุณเขียนโปรแกรม Bash มากขึ้น คุณจะพบโค้ดที่คุณใช้บ่อยมากขึ้น และควรรวมไว้ในเทมเพลตโปรแกรมของคุณ
ทรัพยากร
- วิธีตั้งโปรแกรมด้วย Bash:ไวยากรณ์และเครื่องมือ
- วิธีตั้งโปรแกรมด้วย Bash:ตัวดำเนินการเชิงตรรกะและการขยายเชลล์
- วิธีตั้งโปรแกรมด้วย Bash:Loops
บทความชุดนี้มีเนื้อหาบางส่วนมาจากเล่มที่ 2 บทที่ 10 ของหลักสูตรการเรียนรู้ด้วยตนเองเกี่ยวกับ Linux แบบสามส่วนของ David Both การใช้งานและการดูแลระบบ Linux—Zero to SysAdmin