Lecture 14 คำชี้แจง ------ Lecture นี้แบ่งออกเป็น 3 ตอนคือ Here document, การใช้งานแฟ้ม และตัวอย่างโครงงาน shell script ตอนที่่ ๑ : Here Document ----------------------- Here document (หรือ heredoc) เป็นวิธีการรับข้อมูลเข้าสู่ script โดยไม่ต้องใช้แฟ้ม เป็นวิธีการที่สะดวกสำหรับข้อความขนาดเล็กที่ไม่ค่อยมีการเปลี่ยนแปลง มีรูปแบบการใช้งานดังนี้ คำสั่ง <<[-]ข้อความกำกับ ... ... ... เนื่อความของ here document ... ... ... ข้อความกำกับ Here document เป็นวิธีการเปลี่ยนทิศทางข้อมูลเข้า (redirection) แบบหนึ่งที่กำหนดให้เชลล์อ่านข้อมูลเข้าจากตำแหน่งปัจจุบัน(here) โดยเริ่มจากบรรทัดใต้ "ข้อความกำกับ" (หรือ limit string) และอ่านไปจนกว่าจะพบ "ข้อความกำกับ" ที่ตรงกัน ด้วยเหตุนี้"ข้อความกำกับ" จึงต้องเป็นหนึงเดียวและไม่ปรากฏอยู่ในเนื่อความของ here document และกำหนดว่าด้านหน้าและด้านหลังของ"ข้อความกำกับ" จะต้องไม่มี white space เลยทั้งสองชุด เพื่อให้สามารถจับคู่ได้อย่างแน่นอน นอกจากนี้แล้วข้อความกำกับที่ใช้ปิดท้าย here document ต้องอยู่ในตำแหน่งแรกของบรรทัดเท่านั้น ข้อสังเกต ------- 1. "คำสั่ง" เป็นโปรแกรมที่มีรับข้อมูลทาง standard input เช่น cat, sort, และ grep เป็นต้น 2. ต้องไม่มีวรรคระหว่าง << และ ข้อความกำกับที่จุดเริ่มต้น 3. [-] เป็น option เฉพาะของ bash สำหรับกำจัด Tab ที่อยู่ต้นบรรทัด ในกรณีที่ต้องการย่อหน้า here document ให้สอดคล้องกับโครงสร้างของโปรแกรม และต้องไม่มีวรรคระหว่าง << , - และข้อความกำกับ 4. ต้องไม่มีวรรคหน้าข้อความกำกับที่จุดสิ้นสุด Here document เป็นคุณลักษณะที่มีประโยชน์ และสามารถประยุกต์ใช้งานได้หลายแบบ ขอให้ศึกษาจากตัวอย่างต่อไปนี้ ตัวอย่างที่ 1 การเก็บข้อมูลรวมไว้ในแฟ้มโปรแกรม ------------------------------------- ข้อมูลบางอย่างเป็นข้อมูลที่เมื่อบันทึกแล้ว ไม่มีการเปลี่ยนแปลงแก้ไขเลย เช่น "วันเกิด" และ สถานที่เกิด เป็นต้น ข้อมูลตายคัวเหล่านี้สามารถเก็บรวมไว้กับ script เพื่อความสะดวกในการค้นหา โปรแกรมต่อไปนี้ใช้ในการค้นหาวันเกิดของบุคคล โดยเก็บชื่อและวันเกิดไว้ใน here document และใช้ grep (หรือ egrep) ค้นหาข้อมูลที่ต้องการ เนื่องจาก grep ใช้ค้นคำใดๆ ที่อยู่ในบรรทัดได้ โปรแกรมจึงสามารถให้คำตอบได้สองลักษณะ คือค้นว่าบุคคลที่กำหนดเกิดวันใด และมีบุคคลใดมี วันเกิดในเดือนที่กำหนดบ้าง โปรแกรมเป็นดังนี้ $ cat -n birthday 1 #!/bin/sh 2 3 egrep -i "$1" <<+ # Limit string เป็นเครื่องหมาย + เพียงตัวเดียว 4 Alex June 22 5 Babara February 3 6 Darlene May 8 7 Helen March 13 8 Jenny January 23 9 Nancy June 26 10 + # จุดสิ้นสุดของ here document บรรทัดที่ 4 - 9 เป็น here document แต่ละบรรทัดเป็นข้อมูลของแต่ละบุคคล การเพิ่มข้อมูลทำได้โดยการแทรกชื่อ และวันเกิดเข้าในโปรแกรม ตัวอย่างการทำงานของโปรแกรมเป็นดังนี้ $ birthday Jenny Jenny January 23 $ birthday June Alex June 22 Nancy June 26 หมายเหตุ ------- Limit string หรือ "ข้อความกำกับ" ในตัวอย่างนี้เป็นเครื่องหมาย "+" เพียงตัวเดียว ซึ่งทำงานได้ดี แต่อย่างไรก็ดีการใช้อักขระตัวเดียวเป็นข้อความกำกับ เป็นวิธีการที่ไม่น่าใช้โดยเฉพาะอักขระที่เป็นเครื่องหมายวรรคตอน และอักขระพิเศษ เพราะยากจะหลีกเลี่ยงที่จะไม่ให้ปรากฏในเนื้อความ ข้อความกำกับเป็นสายอักขระที่มีหลายตัวเป็นทางเลือกที่ดีกว่า ตัวอย่างที่ 2 script สำหรับสร้างโครงเอกสาร HTML ---------------------------------------- ดัดแปลงจาก - http://linuxcommand.org/ เกริ่นนำ: มีคำกล่าวว่าโปรแกรมเมอร์ที่เก่งเป็นคนที่ขี้เกียจเขียน ขี้เกียจพิมพ์ จึงเขียนโปรแกรมช่วยเพื่อลดการทำงานเหล่านี้ลงโปรแกรมต่อไปนี้ โปรแกรมใช้สำหรับสร้างโครงของเอกสาร html โดยใช้คำสั่ง echo ส่วนโปรแกรมที่สองใช้ here document $ cat -n html1.sh 1 #!/bin/sh 2 # A script to produce an HTML file 3 4 TITLE="System information for $(hostname).$(hostname -d)" 5 RIGHT_NOW=$(date +"%x %r %Z") 6 TIME_STAMP="Update on $RIGHT_NOW by $USER" 7 8 echo "" 9 echo "
" 10 echo "$TIME_STAMP" 18 echo "" 19 echo "" หมายเหตุ 1. โปรแกรมนี้ใช้คำสั่ง hostname สำหรับแสดงชื่อ และ hostname -d สำหรับแสดง domain name ของเครื่องแม่ข่าย 2. format ของคำสั่ง date ที่ใช้งานเป็นดังนี้ %x แสดงวันที่ในรูป เดือน/วันที่/ปี ค.ศ. เช่น 04/14/2016 %r แสดงเวลาในระบบ 12 ชั่วโมง และ AM หรือ PM เช่น 08:47:10 AM ICT %Z แสดงตัวย่อของ Time Zone เช่น ICT (Indo China Time) เมื่อให้โปรแกรมทำงาน จะได้ผลลัพธ์เป็นโครงของเอกสาร HTML พร้อมข้อมูลที่กำหนดไว้ในตัวแปร ดังนี้ $ html1.sh
Update on 04/14/2016 08:47:10 AM ICT by jira
โปรแกรมทำได้งานตามที่ต้องการ ผู้ใช้สามารถเปลี่ยนทิศทาง output เป็นแฟ้ม *.html ที่ต้องการ เพื่อเพิ่มเนื้อหาของ Web page ให้สมบูรณ์ต่อไป แต่ทุกครั้งที่ต้องการเพิ่มเติม ต้องใช้คำสั่ง echo ทุกครั้ง หากนำ Here document มาใช้งาน จะช่วยให้แก้ไขได้สะดวกขึ้น ดังนี้
$ cat -n html2.sh
1 #!/bin/sh
2 # A script to produce an HTML file
3
4 TITLE="System information for $(hostname).$(hostname -d)"
5 RIGHT_NOW=$(date +"%x %r %Z")
6 TIME_STAMP="Update on $RIGHT_NOW by $USER"
7
8 cat < $TIME_STAMP
19
20 $TITLE
18