Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

ทดสอบสคริปต์ทุบตีของคุณ

ในบทความแรกในชุดนี้ คุณได้สร้างสคริปต์ 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                                         #
#  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"

การออกกำลังกายขั้นสุดท้าย

คุณอาจสังเกตเห็นว่าฟังก์ชันวิธีใช้ในโค้ดของคุณหมายถึงคุณลักษณะที่ไม่ได้อยู่ในโค้ด ในแบบฝึกหัดสุดท้าย ให้หาวิธีเพิ่มฟังก์ชันเหล่านั้นลงในเทมเพลตโค้ดที่คุณสร้างขึ้น

สรุป

ในบทความนี้ คุณได้สร้างฟังก์ชันสองสามอย่างเพื่อทำการทดสอบสติว่าโปรแกรมของคุณทำงานเป็นรูทหรือไม่ โปรแกรมของคุณเริ่มซับซ้อนขึ้นเล็กน้อย การทดสอบจึงมีความสำคัญมากขึ้นและต้องใช้เส้นทางการทดสอบมากขึ้นจึงจะเสร็จสมบูรณ์

ชุดนี้กล่าวถึงโปรแกรม Bash ที่น้อยมาก และวิธีการสร้างสคริปต์ทีละน้อย ผลลัพธ์ที่ได้คือเทมเพลตอย่างง่ายที่สามารถเป็นจุดเริ่มต้นสำหรับสคริปต์ Bash อื่นๆ ที่มีประโยชน์มากกว่า และมีองค์ประกอบที่มีประโยชน์ที่ทำให้ง่ายต่อการเริ่มสคริปต์ใหม่

ถึงตอนนี้ คุณคงเข้าใจแล้วว่า โปรแกรมที่คอมไพล์มีความจำเป็นและเติมเต็มความต้องการที่สำคัญมาก แต่สำหรับผู้ดูแลระบบ ย่อมมีวิธีที่ดีกว่าเสมอ ใช้เชลล์สคริปต์เสมอเพื่อให้ตรงกับความต้องการอัตโนมัติของงานของคุณ เชลล์สคริปต์เปิดอยู่ เนื้อหาและวัตถุประสงค์เป็นที่ทราบ สามารถปรับเปลี่ยนได้ง่ายเพื่อตอบสนองความต้องการที่แตกต่างกัน ฉันไม่เคยพบสิ่งใดที่ต้องทำในบทบาทผู้ดูแลระบบที่ไม่สามารถทำได้ด้วยเชลล์สคริปต์

สิ่งที่คุณสร้างขึ้นในซีรีส์นี้เป็นเพียงจุดเริ่มต้นเท่านั้น เมื่อคุณเขียนโปรแกรม Bash มากขึ้น คุณจะพบโค้ดที่คุณใช้บ่อยมากขึ้น และควรรวมไว้ในเทมเพลตโปรแกรมของคุณ

ทรัพยากร

  • วิธีตั้งโปรแกรมด้วย Bash:ไวยากรณ์และเครื่องมือ
  • วิธีตั้งโปรแกรมด้วย Bash:ตัวดำเนินการเชิงตรรกะและการขยายเชลล์
  • วิธีตั้งโปรแกรมด้วย Bash:Loops

บทความชุดนี้มีเนื้อหาบางส่วนมาจากเล่มที่ 2 บทที่ 10 ของหลักสูตรการเรียนรู้ด้วยตนเองเกี่ยวกับ Linux แบบสามส่วนของ David Both การใช้งานและการดูแลระบบ Linux—Zero to SysAdmin