<ก่อนหน้านี้ | เนื้อหา | ถัดไป>
แอปพลิเคชั่นที่สมบูรณ์ยิ่งขึ้น
หลังจากที่ห่างหายไปนาน เรามาเริ่มงานกันต่อที่ sys_info_page โปรแกรม. การเพิ่มครั้งต่อไปของเราจะเพิ่มตัวเลือกบรรทัดคำสั่งต่างๆ ให้กับโปรแกรมดังนี้:
● ไฟล์เอาท์พุต เราจะเพิ่มตัวเลือกเพื่อระบุชื่อไฟล์เพื่อเก็บเอาท์พุตของโปรแกรม จะระบุเป็นอย่างใดอย่างหนึ่ง -f ไฟล์ or --ไฟล์ ไฟล์.
● โหมดโต้ตอบ ตัวเลือกนี้จะแจ้งให้ผู้ใช้ป้อนชื่อไฟล์เอาต์พุต และจะพิจารณาว่าไฟล์ที่ระบุมีอยู่แล้วหรือไม่ ถ้าเป็นเช่นนั้น ผู้ใช้จะได้รับพร้อมท์ก่อนที่จะเขียนทับไฟล์ที่มีอยู่ ตัวเลือกนี้จะถูกระบุโดยทั้ง -i or --เชิงโต้ตอบ.
● ช่วยด้วย. แต่ละ -h or --ช่วยด้วย อาจมีการระบุเพื่อให้โปรแกรมแสดงข้อความการใช้งานที่ให้ข้อมูล
นี่คือรหัสที่จำเป็นสำหรับการนำการประมวลผลบรรทัดคำสั่งไปใช้:
การใช้งาน () {
echo "$PROGNAME: การใช้งาน: $PROGNAME [-f file | -i]" return
}
# ประมวลผลตัวเลือกบรรทัดคำสั่งแบบโต้ตอบ =
การใช้งาน () {
echo "$PROGNAME: การใช้งาน: $PROGNAME [-f file | -i]" return
}
# ประมวลผลตัวเลือกบรรทัดคำสั่งแบบโต้ตอบ =
ชื่อไฟล์=
ในขณะที่ [[ -n $1 ]]; ทำกรณี $ 1 ใน
-f | --ไฟล์)
เปลี่ยน
ชื่อไฟล์=$1
;;
ชื่อไฟล์=
ในขณะที่ [[ -n $1 ]]; ทำกรณี $ 1 ใน
-f | --ไฟล์)
-i | --แบบโต้ตอบ) โต้ตอบ=1
;;
-h | --help) ออกจากการใช้งาน
;;
*) การใช้งาน >&2
ทางออก 1
;;
-i | --แบบโต้ตอบ) โต้ตอบ=1
;;
-h | --help) ออกจากการใช้งาน
;;
*) การใช้งาน >&2
ทางออก 1
;;
ว่า C
กะเสร็จ
ว่า C
กะเสร็จ
ขั้นแรก เราเพิ่มฟังก์ชันเชลล์ที่เรียกว่า การใช้ เพื่อแสดงข้อความเมื่อมีการเรียกใช้ตัวเลือกความช่วยเหลือหรือพยายามใช้ตัวเลือกที่ไม่รู้จัก
ต่อไป เราจะเริ่มการประมวลผลแบบวนซ้ำ วนซ้ำนี้ดำเนินต่อไปในขณะที่พารามิเตอร์ตำแหน่ง
$1 ไม่ว่างเปล่า ในตอนท้ายของลูป เรามีคำสั่ง shift เพื่อเลื่อนพารามิเตอร์ตำแหน่งเพื่อให้แน่ใจว่าลูปจะสิ้นสุดในที่สุด
ภายในลูป เรามี a กรณี คำสั่งที่ตรวจสอบพารามิเตอร์ตำแหน่งปัจจุบันเพื่อดูว่าตรงกับตัวเลือกที่รองรับหรือไม่ หากพบพารามิเตอร์ที่รองรับ จะดำเนินการตามนั้น หากตัวเลือกที่ไม่รู้จักคือ founc ข้อความการใช้งานจะปรากฏขึ้นและสคริปต์จะสิ้นสุดลงโดยมีข้อผิดพลาด
พื้นที่ -f พารามิเตอร์ได้รับการจัดการในลักษณะที่น่าสนใจ เมื่อตรวจพบจะทำให้เกิดการเพิ่มเติม เปลี่ยน ที่จะเกิดขึ้นซึ่งความก้าวหน้าของพารามิเตอร์ตำแหน่ง $1 ไปยังอาร์กิวเมนต์ชื่อไฟล์ที่ส่งให้กับ -f ตัวเลือก
ต่อไปเราจะเพิ่มโค้ดเพื่อใช้งานโหมดโต้ตอบ:
# โหมดโต้ตอบ
ถ้า [[ -n $โต้ตอบ ]]; แล้วในขณะที่จริง; ทำ
อ่าน -p "ป้อนชื่อไฟล์ที่ส่งออก: " ชื่อไฟล์ถ้า [[ -e $filename ]]; แล้ว
read -p "'$filename' มีอยู่แล้ว เขียนทับหรือไม่ [y/n/q] > " case $REPLY in
Y|y) แตก
# โหมดโต้ตอบ
ถ้า [[ -n $โต้ตอบ ]]; แล้วในขณะที่จริง; ทำ
อ่าน -p "ป้อนชื่อไฟล์ที่ส่งออก: " ชื่อไฟล์ถ้า [[ -e $filename ]]; แล้ว
read -p "'$filename' มีอยู่แล้ว เขียนทับหรือไม่ [y/n/q] > " case $REPLY in
Y|y) แตก
;;
Q|q) echo "โปรแกรมถูกยกเลิก" ทางออก
;;
*) ดำเนินต่อ
;;
ว่า C
elif [[ -z $filename ]]; แล้วไปต่อ
อื่น
ทำลาย
fi
ทำ
fi
;;
Q|q) echo "โปรแกรมถูกยกเลิก" ทางออก
;;
*) ดำเนินต่อ
;;
ว่า C
elif [[ -z $filename ]]; แล้วไปต่อ
อื่น
ทำลาย
fi
ทำ
fi
ถ้า การโต้ตอบ ตัวแปรไม่ว่างเปล่า เริ่มวนซ้ำไม่รู้จบ ซึ่งประกอบด้วยพรอมต์ชื่อไฟล์และโค้ดการจัดการไฟล์ที่มีอยู่ในภายหลัง หากมีไฟล์เอาต์พุตที่ต้องการอยู่แล้ว ผู้ใช้จะได้รับแจ้งให้เขียนทับ เลือกชื่อไฟล์อื่น หรือออกจากโปรแกรม หากผู้ใช้เลือกที่จะเขียนทับไฟล์ที่มีอยู่ a ทำลาย ถูกดำเนินการเพื่อยุติการวนซ้ำ สังเกตว่า กรณี คำสั่งจะตรวจเฉพาะว่าผู้ใช้เลือกที่จะเขียนทับหรือออกเท่านั้น ตัวเลือกอื่นจะทำให้การวนซ้ำดำเนินต่อไปและแจ้งให้ผู้ใช้ทราบอีกครั้ง
ในการใช้คุณสมบัติชื่อไฟล์เอาต์พุต อันดับแรกเราต้องแปลงโค้ดการเขียนหน้าที่มีอยู่ให้เป็นฟังก์ชันเชลล์ ด้วยเหตุผลที่ชัดเจนในเวลาอันสั้น:
write_html_page () { แมว <<- _EOF_
$TITLE
$TITLE
$TIMESTAMP
$(report_uptime)
$(รายงาน_disk_space)
$(report_home_space)
_EOF_ กลับมา
}
# หน้า html เอาต์พุต
ถ้า [[ -n $filename ]]; แล้ว
write_html_page () { แมว <<- _EOF_
$TITLE
$TITLE
$TIMESTAMP
$(report_uptime)
$(รายงาน_disk_space)
$(report_home_space)
_EOF_ กลับมา
}
# หน้า html เอาต์พุต
ถ้า [[ -n $filename ]]; แล้ว
ถ้าแตะ $filename && [[ -f $filename ]]; จากนั้น write_html_page > $filename
อื่น
echo "$PROGNAME: ไม่สามารถเขียนไฟล์ '$filename'" >&2 exit 1
fi อื่น
เขียน_html_page
fi
ถ้าแตะ $filename && [[ -f $filename ]]; จากนั้น write_html_page > $filename
อื่น
echo "$PROGNAME: ไม่สามารถเขียนไฟล์ '$filename'" >&2 exit 1
fi อื่น
เขียน_html_page
fi
รหัสที่จัดการตรรกะของ -f ตัวเลือกจะปรากฏที่ส่วนท้ายของรายการที่แสดงด้านบน ในนั้น เราทดสอบการมีอยู่ของชื่อไฟล์ และหากพบหนึ่งไฟล์ จะมีการทดสอบต่อรูปแบบเพื่อดูว่าไฟล์นั้นเขียนได้จริงหรือไม่ การทำเช่นนี้ a แตะ ถูกดำเนินการ ตามด้วยการทดสอบเพื่อตรวจสอบว่าไฟล์ผลลัพธ์เป็นไฟล์ปกติหรือไม่ การทดสอบทั้งสองนี้จะดูแลการนั่ง - uations ที่มีการป้อนชื่อพาธที่ไม่ถูกต้อง (แตะ จะล้มเหลว) และหากไฟล์นั้นมีอยู่แล้ว แสดงว่าเป็นไฟล์ปกติ
อย่างที่เราเห็นไฟล์ เขียน_html_page ฟังก์ชันถูกเรียกให้สร้างเพจจริง เอาต์พุตจะถูกส่งไปยังเอาต์พุตมาตรฐาน (ถ้าตัวแปร ชื่อไฟล์ ว่างเปล่า) หรือเปลี่ยนเส้นทางไปยังไฟล์ที่ระบุ