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

วิธีเพิ่มสิ่งอำนวยความสะดวกในโปรแกรม Bash ของคุณ

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

บทความที่สามจากสี่บทความในชุดนี้อธิบายวิธีสร้างและใช้ฟังก์ชันวิธีใช้อย่างง่าย ขณะสร้างสิ่งอำนวยความสะดวกใน Help คุณจะได้เรียนรู้เกี่ยวกับการใช้ฟังก์ชันและวิธีจัดการกับตัวเลือกบรรทัดคำสั่ง เช่น -h .

ทำไมต้องช่วย

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

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

เกี่ยวกับฟังก์ชัน

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

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

ไวยากรณ์ของฟังก์ชันคือ:

FunctionName(){program statements}

สำรวจสิ่งนี้ด้วยการสร้างฟังก์ชันง่ายๆ ที่ CLI (ฟังก์ชันถูกเก็บไว้ในสภาพแวดล้อมของเชลล์สำหรับอินสแตนซ์ของเชลล์ที่สร้างขึ้น) คุณจะสร้างฟังก์ชันชื่อ hw ซึ่งย่อมาจาก "สวัสดีชาวโลก" ป้อนรหัสต่อไปนี้ที่ CLI แล้วกด Enter . จากนั้นป้อน hw เช่นเดียวกับที่คุณทำกับคำสั่งเชลล์อื่น ๆ :

[student@testvm1 ~]$ hw(){ echo "Hi there kiddo"; }
[student@testvm1 ~]$ hw
Hi there kiddo
[student@testvm1 ~]$

ตกลง ฉันรู้สึกเหนื่อยเล็กน้อยกับการเริ่มต้น "Hello world" แบบมาตรฐาน ตอนนี้ แสดงรายการฟังก์ชันที่กำหนดไว้ในปัจจุบันทั้งหมด มีจำนวนมาก ดังนั้นฉันจึงแสดงเฉพาะ hw . ใหม่ การทำงาน. เมื่อถูกเรียกจากบรรทัดคำสั่งหรือภายในโปรแกรม ฟังก์ชันจะทำงานตามโปรแกรม จากนั้นออกจากและส่งคืนการควบคุมไปยังเอนทิตีที่เรียก บรรทัดคำสั่ง หรือคำสั่งโปรแกรม Bash ถัดไปในสคริปต์หลังคำสั่งเรียก:

[student@testvm1 ~]$ declare -f | less
<snip>
hw ()
{
    echo "Hi there kiddo"
}
<snip>

ลบฟังก์ชันนั้นออกเพราะคุณไม่ต้องการมันอีกต่อไป คุณสามารถทำได้ด้วยปุ่ม unset คำสั่ง:

[student@testvm1 ~]$ unset -f hw ; hw
bash: hw: command not found
[student@testvm1 ~]$

การสร้างฟังก์ชันช่วยเหลือ

เปิด สวัสดี โปรแกรมในโปรแกรมแก้ไขและเพิ่มฟังก์ชันช่วยเหลือด้านล่างใน สวัสดี รหัสโปรแกรมหลังคำชี้แจงลิขสิทธิ์ แต่ก่อน เสียงสะท้อน "สวัสดีชาวโลก!" คำแถลง. ฟังก์ชันวิธีใช้นี้จะแสดงคำอธิบายสั้นๆ ของโปรแกรม ไดอะแกรมไวยากรณ์ และคำอธิบายสั้นๆ ของตัวเลือกที่มี เพิ่มการเรียกใช้ฟังก์ชันวิธีใช้เพื่อทดสอบและบรรทัดความคิดเห็นบางส่วนที่ให้การแบ่งเขตภาพระหว่างฟังก์ชันและส่วนหลักของโปรแกรม:

################################################################################
# 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!"

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

[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 ~]$

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

ตัวเลือกการจัดการ

ความสามารถของสคริปต์ทุบตีในการจัดการตัวเลือกบรรทัดคำสั่ง เช่น -h ให้ความสามารถอันทรงพลังในการกำกับโปรแกรมและแก้ไขสิ่งที่ทำ ในกรณีของ -h คุณต้องการให้โปรแกรมพิมพ์ข้อความวิธีใช้ไปยังเซสชันเทอร์มินัลแล้วออกจากโปรแกรมโดยไม่เรียกใช้โปรแกรมที่เหลือ ความสามารถในการประมวลผลตัวเลือกที่ป้อนในบรรทัดคำสั่งสามารถเพิ่มลงในสคริปต์ทุบตีโดยใช้ ในขณะที่ คำสั่ง (ดู วิธีตั้งโปรแกรมด้วย Bash:Loops เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับในขณะที่ ) ร่วมกับ getops และ กรณี คำสั่ง

gettops คำสั่งจะอ่านตัวเลือกใดๆ และทั้งหมดที่ระบุในบรรทัดคำสั่ง และสร้างรายการตัวเลือกเหล่านั้น ในโค้ดด้านล่าง ในขณะที่ คำสั่งวนซ้ำในรายการตัวเลือกโดยการตั้งค่าตัวแปร $options แต่ละ. กรณี คำสั่งใช้เพื่อประเมินแต่ละตัวเลือกในทางกลับกันและดำเนินการคำสั่งในบทที่เกี่ยวข้อง ในขณะที่ คำสั่งจะดำเนินการประเมินรายการตัวเลือกต่อไปจนกว่าจะได้รับการประมวลผลทั้งหมดหรือพบคำสั่งออกซึ่งจะยุติโปรแกรม

อย่าลืมลบการเรียกใช้ฟังก์ชัน Help ก่อน echo "Hello world!" คำสั่งเพื่อให้เนื้อหาหลักของโปรแกรมตอนนี้มีลักษณะดังนี้:

################################################################################
################################################################################
# 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!"

สังเกตเครื่องหมายอัฒภาคคู่ที่ส่วนท้ายของคำสั่ง exit ในตัวเลือก case สำหรับ -h . สิ่งนี้จำเป็นสำหรับแต่ละตัวเลือกที่เพิ่มในคำสั่ง case นี้เพื่อกำหนดจุดสิ้นสุดของแต่ละตัวเลือก

กำลังทดสอบ

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

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

ได้ผล ดังนั้นตอนนี้ให้ทดสอบตรรกะที่แสดงข้อความช่วยเหลือ:

[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.

ใช้งานได้ตามที่คาดไว้ ดังนั้นลองใช้การทดสอบเพื่อดูว่าจะเกิดอะไรขึ้นเมื่อคุณป้อนตัวเลือกที่ไม่คาดคิด:

[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 ~]$

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

คุณสามารถเพิ่ม case stanza อื่นในคำสั่ง case เพื่อให้ตรงกับตัวเลือกใดๆ ที่ไม่มีการจับคู่ที่ชัดเจน กรณีทั่วไปนี้จะตรงกับสิ่งที่คุณไม่ได้ระบุให้ตรงกัน คำชี้แจงกรณีขณะนี้มีลักษณะเช่นนี้ โดยมีการจับคู่แบบจับทั้งหมดเป็น \? เป็นกรณีสุดท้าย กรณีเฉพาะเพิ่มเติมใดๆ จะต้องมาก่อนกรณีสุดท้ายนี้:

while getopts ":h" option; do
   case $option in
      h) # display Help
         Help
         exit;;
     \?) # incorrect option
         echo "Error: Invalid option"
         exit;;
   esac
done

ทดสอบโปรแกรมอีกครั้งโดยใช้ตัวเลือกเดิมและดูว่าตอนนี้ทำงานอย่างไร

คุณอยู่ที่ไหน

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

#!/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|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!"

อย่าลืมทดสอบโปรแกรมเวอร์ชันนี้อย่างละเอียดถี่ถ้วน ใช้อินพุตแบบสุ่มและดูว่าเกิดอะไรขึ้น คุณควรลองทดสอบตัวเลือกที่ถูกต้องและไม่ถูกต้องโดยไม่ใช้เครื่องหมายขีดกลาง (- ) ข้างหน้า.

ครั้งหน้า

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

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

ทรัพยากร

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

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