ในบทความแรกในชุดนี้ คุณได้สร้างสคริปต์ 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 #
# [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!"
อย่าลืมทดสอบโปรแกรมเวอร์ชันนี้อย่างละเอียดถี่ถ้วน ใช้อินพุตแบบสุ่มและดูว่าเกิดอะไรขึ้น คุณควรลองทดสอบตัวเลือกที่ถูกต้องและไม่ถูกต้องโดยไม่ใช้เครื่องหมายขีดกลาง (- ) ข้างหน้า.
ครั้งหน้า
ในบทความนี้ คุณได้เพิ่มฟังก์ชันวิธีใช้และความสามารถในการประมวลผลตัวเลือกบรรทัดคำสั่งเพื่อแสดงแบบเลือก โปรแกรมเริ่มซับซ้อนขึ้นเล็กน้อย การทดสอบจึงมีความสำคัญมากขึ้นและต้องใช้เส้นทางการทดสอบมากขึ้นจึงจะเสร็จสมบูรณ์
บทความต่อไปจะกล่าวถึงการเริ่มต้นตัวแปรและทำการตรวจสอบสติเล็กน้อยเพื่อให้แน่ใจว่าโปรแกรมจะทำงานภายใต้ชุดเงื่อนไขที่ถูกต้อง
ทรัพยากร
- วิธีตั้งโปรแกรมด้วย Bash:ไวยากรณ์และเครื่องมือ
- วิธีตั้งโปรแกรมด้วย Bash:ตัวดำเนินการเชิงตรรกะและการขยายเชลล์
- วิธีตั้งโปรแกรมด้วย Bash:Loops
บทความชุดนี้ใช้เนื้อหาบางส่วนจากเล่มที่ 2 บทที่ 10 ของหลักสูตรการเรียนรู้ด้วยตนเองเกี่ยวกับ Linux แบบสามส่วนของ David Both การใช้และการดูแลระบบ Linux—Zero to SysAdmin