Lecture09 -...

19
Lecture09 - สัปดาห์แรกหลังสอบกลางภาค ---------------------------------- "Take a bit of time to get the hang of it now and it’ll pay off later." "ยอมเสียเวลาวันนี ้สักเล็กน้อยเพื่อเรียนรู้และทาความเข้าใจ แล้ววันหนึ ่งข้างหน้าจะได้รับผลตอบแทนที่คุ้มค่า" ก่อนจะได้กล่าวถึงการเขียนโปรแกรม shell script ยังมีเรื่องเก็บเล็กผสมน้อยของเชลล์ที่ยังอาจกล่าวถึงไม่ครบถ้วน และมี บางส่วนเพิ่มเติม ซึ ่งมีความจาเป็นต่อการเขียนโปรแกรม บางเรื่องอาจเคยกล่าวถึงมาแล้วบ้าง ถือเป็นการทบทวนไปในตัว ดังต่อไปนี คาสั่งภายในของเชลล์ (internal command) ------------------------------------ คาสั่งภายในของเชลล์ เป็นคาสั่งเฉพาะของเชลล์แบบใดแบบหนึ ่งโดยเฉพาะ คาสั่งเช่นนี ้อาจจะมีในเชลล์อื่นหรือไม่ก็ได้ เมื่อ เปลี่ยนเชลล์ ใหม่ต้องตรวจสอบว่ามีคาสั่งให้เช่นนี ้ให้ใช้งานหรือไม่ หากมีรูปแบบเหมือนกันหรือต่างกันอย่างไร และหากไม่ มี มีคาสั่งใดที่มีการทางานลักษณะเดียวกันหรือไมo ตัวอย่าง คาสั่ง umask เป็นคาสั่งกาหนดตัวพรางสาหรับสร้างแฟ้ม (file creation mask) ของ bash ซึ ่งเคยใช้งานแล้วในแฟ้ม .bash_profile เนื่องจากเป็นคาสั่งของ bash จึงไม่มีรายละเอียดใน online manual page หากใช้คาสั่ง $ man umask จะได้รายละเอียดของบริการ umask() ของระบบปฏิบัติการ ซึ ่งอยู่ในหมวดที2 ของ online manual page เป็นบริการที่ใช้สาหรับการเขียนโปรแกรมภาษา C หากต้องการอ่านรายละเอียด umask ของ bash ต้องอ่านจากคาสั่ง bash $ man bash bash เป็นโปรแกรมขนาดใหญ่และมีรายละเอียดมาก จึงต้องใช้การค้นคาที่ต้องการ โดยกดแป้น / เพื่อเข้าสูlast line mode และพิมพ์คาว่า umask แล้วกด <Enter> จะปรากฏแถบแสงทับคาว่า umask ซึ ่งหากยังไม่ใช่คาที่ต้องการ ให้เลื่อนไปยังคาต่อไปด้วยแป้น N จนกว่าจะพบจุดที่ต้องการ วิธีการนี ้มีข้อเสียคืออาจต้องเลื่อนตาแหน่งหลายครั ้งกว่าจะพบจุดทีต้องการอ่าน แต่มีข้อดีที่อาจสามารถใช้ได้กับคาที่สนใจทุกคา ในกรณีที่ต้องการรายละเอียดของคาสั่งภายใน bash มีคาสั่ง help ไว้ให้แล้ว $ help แสดงคาสั่งภายในทั ้งหมดของ bash และรูปแบบการใช้งานอย่างย่อ หากต้องการดูรายละเอียดของคาสั่งใด สามารถใช้ คาสั่งนั ้นเป็น keyword ของ help ได้ เช่นหากต้องการรายละเอียดของคาสั่ง umask ใช้คาสั่งดังนี $ help umask

Transcript of Lecture09 -...

Page 1: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

Lecture09 - สปดาหแรกหลงสอบกลางภาค ----------------------------------

"Take a bit of time to get the hang of it now and it’ll pay off later."

"ยอมเสยเวลาวนนสกเลกนอยเพอเรยนรและท าความเขาใจ แลววนหนงขางหนาจะไดรบผลตอบแทนทคมคา"

กอนจะไดกลาวถงการเขยนโปรแกรม shell script ยงมเรองเกบเลกผสมนอยของเชลลทยงอาจกลาวถงไมครบถวน และมบางสวนเพมเตม ซงมความจ าเปนตอการเขยนโปรแกรม บางเรองอาจเคยกลาวถงมาแลวบาง ถอเปนการทบทวนไปในตว ดงตอไปน

ค าสงภายในของเชลล (internal command) ------------------------------------

ค าสงภายในของเชลล เปนค าสงเฉพาะของเชลลแบบใดแบบหนงโดยเฉพาะ ค าสงเชนนอาจจะมในเชลลอนหรอไมกได เมอเปลยนเชลล ใหมตองตรวจสอบวามค าสงใหเชนนใหใชงานหรอไม หากมรปแบบเหมอนกนหรอตางกนอยางไร และหากไมม มค าสงใดทมการท างานลกษณะเดยวกนหรอไม

o ตวอยาง ค าสง umask เปนค าสงก าหนดตวพรางส าหรบสรางแฟม (file creation mask) ของ bash

ซงเคยใชงานแลวในแฟม .bash_profile เนองจากเปนค าสงของ bash จงไมมรายละเอยดใน online manual page หากใชค าสง

$ man umask

จะไดรายละเอยดของบรการ umask() ของระบบปฏบตการ ซงอยในหมวดท 2 ของ online manual page เปนบรการทใชส าหรบการเขยนโปรแกรมภาษา C

หากตองการอานรายละเอยด umask ของ bash ตองอานจากค าสง bash

$ man bash

bash เปนโปรแกรมขนาดใหญและมรายละเอยดมาก จงตองใชการคนค าทตองการ โดยกดแปน / เพอเขาส last line mode และพมพค าวา umask แลวกด <Enter> จะปรากฏแถบแสงทบค าวา umask ซงหากยงไมใชค าทตองการ ใหเลอนไปยงค าตอไปดวยแปน N จนกวาจะพบจดทตองการ วธการนมขอเสยคออาจตองเลอนต าแหนงหลายครงกวาจะพบจดทตองการอาน แตมขอดทอาจสามารถใชไดกบค าทสนใจทกค า ในกรณทตองการรายละเอยดของค าสงภายใน bash มค าสง help ไวใหแลว

$ help

แสดงค าสงภายในทงหมดของ bash และรปแบบการใชงานอยางยอ หากตองการดรายละเอยดของค าสงใด สามารถใชค าสงนนเปน keyword ของ help ได เชนหากตองการรายละเอยดของค าสง umask ใชค าสงดงน

$ help umask

Page 2: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

นอกจากจะใชงานกบค าสงโดยตรงแลว ผใชยงสามารถก าหนด pattern ส าหรบการคนหาไดดวยเชน help u* เปนการแสดงวธการ ใชงานของค าสงภายในทงหมดทขนตนดวยอกษร u

นอกจากจะสามารถใชงานกบค าสงภายในโดยทวไปของ bash แลว ค าสง help ยงสามารถใชแสดงรายละเอยดและวธใชงานของของค าสงทใชก าหนดโครงสรางควบคมการท างานเชน case, for, while และ until ไดดวย ซงชวยอ านวยความสะดวกส าหรบผเรมตนเขยน shell script ไดมาก

นอกจากค าสงภายในของ shell ซงเปน "ค า" ภาษาองกฤษแลว bash ยงค าสงอกสวนหนงเปนอกขระพเศษ (meta-character) ไดแก

สญลกษณ ความหมาย ----------- ------------

( ) เชลลยอย (subshell) $( ) การน าผลลพธมาใชแทนค าสง (( )) การปะมวลผลนพจนคณตศาสตร เปนรปแบบยอของค าสง let $(( )) การขยายนพจนคณตศาสตร (arithmetic expansion) [ ] รปยอของค าสง test [[ ]] นพจนเงอนไขส าหรบ string

การใชงานอกขระพเศษเหลานจะไดกลาวถงเปนล าดบไป ส าหรบตอนนขอใหจ าสญลกษณเหลานไวกอน เพอจะไดไมน าไปใชโดยรเทาไมถงการณและท าใหเกดความผดพลาดขน

การแยกค าสงดวย semicolon และ newline

----------------------------------

; และ <newline> ใชแยกค าสง หากก าหนดให x, y และ z เปนค าสง 3 ค าสง การสงงานสองแบบตอไปนสมนยกน $ x

$ y -- สมนยกบ -- $ x ; y ; z $ z

\ - continues a command ----------------------

ในกรณทค าสงยาวเกนกวา 1 บรรทด สามารถใช \ เพอเชอมตอค าสงไปยงบรรทดตอไปได เชน $ echo "Hello \ ... (1)

> world" ... (2)

Hello world

ทายบรรทดท (1) พมพเครองหมาย \ กอนกด <Enter> หรอเปน \<newline> เปนการเปลยนสถานะของ <newline> ใหเปนอกขระธรรมดา เนองจากยงไมจบบรรทดค าสง เชลลจะแสดง secondary prompt ซงก าหนดดวยตวแปร PS2 เพอใหผใชปอนค าสงตอไป

Page 3: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

$ set | egrep "PS[[:digit:]]"

PS1='$ ' # primary prompt

PS2='> ' # secondary prompt

PS4='+ '

set เปนค ำสงภำยในของเชลล ใชส ำหรบก ำหนดคำของตวแปรระบบ ในกรณทไมม argument ใชแสดงคำของตวแปรระบบทงหมด

& การท างานในพนหลง (background) -----------------------------

& เปนสญลกษณส าหรบก าหนดใหมการท างานแบบ background

ก าหนดให a, b และ c เปนค าสง 3 ค าสง

$ a& b& c # a และ b ท างานแบบ background, c ท างานแบบ foreground [1] 12345 # เชลลตอบสนองดวย หมายเลขงาน (job number)

[2] 12346 # และหมายเลขโพรเซส (PID) ทท างานแบบ background

เมอเชลลท างานตามค าสง c เสรจจะแสดง prompt ทนท โดยไมสนใจวา a และ b จะท างานเสรจแลวหรอไม

ในกรณทมงานแบบ background ท างานอย ทกครงทเชลลจะแสดง prompt จะตรวจสอบสถานะการท างานของ background process เสมอ หากมงานใดทเสรจเชลลจะรายงานสถานะเชน

[1]- Done a

[2]+ Done b

เครองหมาย + แสดงวาเปนงานสดทายทท า สวนเครองหมาย - เปนงานทท ากอน

สมมตวามการใชงานค าสง a, b และ c เปน pipeline และสมตวา c เปนโพรเซสทใชเวลาในการท างานมากทสด ผใชสามารถก าหนดให c ท างานแบบ backgroud ได เชน $ a | b | c&

[1] 23456

เมอ a และ b ท างานเสรจเชลลจะแสดง prompt เพอรบค าสงตอไป โดยปลอยให c ท างานในแบบ background ตอไป

การจดกลมค าสงดวย () -----------------

ก าหนดให a, b, c และ d เปนค าสง 4 ค าสง

$ ( a ; b )& c&

[1] 23467

[2] 23468

Page 4: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

ค าสงนก าหนดให a และ b ท างานตอเนองกน ท า a กอนเสรจแลวจงท า b แตทง a และ b ซงอยในกลมเดยวกนท างานในแบบ background ( a ; b )& เปนงานล าดบท [1] -- เครองหมายวงเลบท าใหเกด subshell เมอก าหนดให a และ b ท างานแบบ background แลว จงก าหนดให c ท างานแบบ background ดวยเปนงานล าดบท [2] ซงตางจากค าสง

$ a& b& c&

ซงจะก าหนดให a, b, และ c ท างานแบบ background ดงนนดพรเซสทงสามจงท างานขนานกนไป (concurrent processes) ส าหรบตวอยางการใช () จดกลมค าสงทชดเจน จะเหนไดใน script ส าหรบคดลอกแฟมระหวางไดเรกทอร ตอนทายบทน

การควบคมการท างานของโพรเซสในระดบ shell -------------------------------------

ผใชสามารถสราง ควบคมการท างาน และท าลายโพรเซสไดในระดบ shell เพอใหมความแตกตางออกไปจากการด าเนนการของระบบปฏบตการและ จงก าหนดใหเรยกโพรเซสในระดบ shell วา job และมค าสงของ shell ส าหรบด าเนนการกบ job เหลานน

การเรยนร job และค าสงควบคม job คอนขางเขาใจยาก วธการทดแบบหนงคอท าความเขาใจจากตวอยาง

เรยกใชโปรแกรม vi เพอพมพแฟม hello.c $ vi hello.c

พมพบรรทดแรก #include <stdio.h> กด <Esc> เพอกลบส command mode ของ vi และกด Ctrl-Z (^Z) ระบบจะแสดงขอความตอไปนทบรรทดลางสด

[1]+ Stopped vi hello.c

Ctrl-Z โดยทวไปก าหนดไวเปน suspended key ซงท าใหโพรเซสปจจบนเขาสสถานะ suspended หรอ stopped

ขณะน vi เขาสสถานะ suspended หรอ stopped แลว

เพอไมใหเกดความสบสนระหวางการควบคมโพรเซสดวยโปรแกรมอรรถประโยชน เชน ps และ kill, กบการควบคมโพรเซสในระดบของเชลล จงนยมเรยกโพรเซสในระดบเชลลวา "'งาน" หรอ job โดบมค าสงควบคม "งาน" ในระดบของเชลลดงน

ค าสง jobs ---------

jobs - แสดง job ทงหมดของผใชทมอยในขณะนน เชน $ jobs

[1]+ Stopped vi hello.c

Page 5: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

ขณะนมงานอยเพยงงานเดยวคอ vi hello.c และอยในสถานะ suspended หรอ stopped โดย shell ก าหนดใหเปนงานหมายเลข 1 ซงหมายเลขนเปนหมายเลขอางองในค าสงควบคม job อนๆ

ค ำสง fg ------

fg - น า job ทหยดการท างานอยหรอท างานอยใน background มาเปนงานแบบ foreground $ fg <[%]หมายเลข job> # เครองหมาย % จะใชหรอไมกได เชน $ fg %1

น างานหมายเลข 1 ซงไดแก vi hello ซงหยดการท างานอย ใหกลบมาเปนงานแบบ foreground ซงผใชจะไดหนาจอของ vi เดมทคางอยและพรอมทจะท างานตอไป

โดยทวไปเมอผใชตองการเปลยนงานแบบ foreground เปนงานแบบ background ตองหยดการท างานของงาน foreground กอนโดยการกด Ctrl-Z เมองานนนเขาสสถานะ suspended หรอ stoped แลวจงใชค าสง bg เปลยนงานนนเปน background

ค ำสง bg -------

bg - เปลยนงานทอยในสถานะ suspened เปนงานแบบ background $ fg <[%]หมายเลข job> # เครองหมาย % จะใชหรอไมกได เชนในขณะท vi hello.c อยในสถานะ suspended หากใชค าสง $ bg %1

จะไดผลลพธเปน [1]+ vi hello.c &

เครองหมาย & ทอยทายสดของบรรทด แสดงวางานหมายเลข 1 ก าลงท างานแบบ background ซงในกรณของ vi ไมมความแตกตางจากสถานะ suspened เนองจากเปนโปรแกรมแบบ interactive ตองมการใชงาน terminal จงจะสามารถท างานได งานทควรก าหนดใหท างานแบบ background ควรเปนงานทไมตองอาศย terminal ในการท างาน เชนการ download ขอมลจากเครองอนในเครอขาย

ค ำสง kill

-------

kill - สงสญญาณไปยงงานในสถานะ suspended หรองานแบบ background เชน kill -n 9 %1

-n 9 : ก าหนดใหสงสญญาณหมายเลข 9 (SIGKILL) ไปยงงานหมายเลข 1 ตองน าหนาดวยเครองหมาย % เสมอ

หมายเหต ------

1. ค าสง kill ของ shell เปนค าสงทไมคอยไดรบความนยมใชงาน เพราะสามารถใชค าสง kill ทเปน Utilities ไดอยแลว 2. หากเรยกใช vi แกไขแฟมทมอยแลว เชน hello.c, vi จะเปลยนชอแฟมเดมเปน .hello.c.swp (เรยกวา swap file) เมอ

Page 6: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

ผใชสงบนทกแฟม vi จะน าขอมลในหนวยความจ าทมการแกไขบนทกลงในชอ hello.c และลบแฟม .hello.c.swp หากมการใชค าสง kill ไมวาจะเปนค าสงของ shell หรอ utility โพรเซสของ vi จะถกท าลายไป แตยงคงมแฟม .hello.c.swp เหลออย เมอผใชค าสง vi hello.c อกครงหนง vi จะเตอนวาม swap file อยแลวดงน

Swap file ".hello.c.swp" already exists!

[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

ซงผใชสามารถเลอกด าเนนการไดหลายอยาง เชนกคน (Recover), ลบทง (Delete) หรอเลก (Quit) โดยการปอนอกษรตวแรก ในกรณของการ quit และไมตองการแฟมนนแลว ผใชตองลบ swap file ดวยตนเอง

ควำมสมพนธของงำนแบบ foreground, suspended และ background

-------------------------------------------------------------

การควบคมงานลกษณะน ควรฝกใชงานใหคลอง โดยเฉพาะเมอใช vi เปน editor เนองจากการกดแปน Shift-ZZ ส าหรบ save และ exit ของ vi และการกด Ctrl-Z เพอน าโพรเซสทก าลงท างานในปจจบนเขาสสถานะ suspended ใกลเคยงกนมาก อาจเกดความผดพลาดไดบอย จะไดตรวจสอบและแกไขได

การจดการกบไดเรกทอร - การกลบไปยงไดเรกทอรทเคยใชงานลาสด ---------------------------------------------------

ค าสง cd ตามดวยเครองหมายขด (cd -) ใชส าหรบสลบไดเรกทอร ระหวางไดเรกทอรปจจบน และไดเรกทอรทเคยใชงานลาสด เมอสลบแลว จะแสดงชอไดเรกทอรปจจบนใหดวย ดงตวอยางตอไปน

$ pwd

/home/staff/jira/public_html/886326/Lectures

$ cd /usr/sbin

$ pwd

/usr/sbin

Page 7: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

$ cd -

/home/staff/jira/public_html/886326/Lectures

$ cd -

/usr/sbin

ค าสง cd ทมการใชงานบอยๆ ---------------------

$ cd # กลบ home directory $ cd .. # เปลยนไปยง parent directory - ขนไปหนงระดบ $ cd ../.. # เปลยนไดเรกทอรขนไปสองระดบ

Q&A

---

Q: ค าสง 'cd .' เปนค าสงทไมมผลลพธใดและไมเกด error เพราะเหตใดจงเปนเชนนน? A: เพราะเปนค าสงเปลยนไดเรกทอรทก าลงใชงานอยในปจจบนเปนไดเรกทอรเดม (เปลยนกลบไปอยทเดม) จงไมมผลใด ทไมเกด error เพราะเปนค าสงทถกตองตามรปแบบการใชงานของค าสง cd

Q: เมอผใชค าสง 'man cd' เพอดรายละเอยดของค าสง cd จงปรากฏผลดงน $ man cd

No manual entry for cd # ไมมขอมลส าหรบค าสง cd A: เพราะ cd เปนค าสงภายในของ bash ดงนนหากตองการดรายละเอยดตองใชค าสง 'help cd'

การเขยนโปรแกรม shell script ---------------------------

The Bourne Again Shell - bash ------------------------------

Bourne Shell เปนเชลลทไดรบการพฒนาขนโดย Steve Bourne แหงหองปฏบตการวจยเบลล (AT&T's Bell Lab) ในป 1977 สวน Bourne Again Shell (bash) พฒนาขนโดย Brian Fox เปนซอฟตแวรใหเปลาส าหรบใชทดแทน Bourne shell ในโครงการ GNU Project ในป 1989 และไดรบการก าหนดเปนเชลลโดยปรยายของระบบปฏบตการ Linux และระบบปฏบตการ macOS ของบรษท Apple

นอกจาก Bourne shell (sh) แลว ยงมเชลลอนทไดรบความนยมอกหลายแบบ เชน C-shell (csh) ซงพฒนาขนชวงปลาย 1970s โดย Bill Joy ในขณะทยงเปนนกศกษาปรญญาโททมหาวทยาลยแคลฟอรเนย เบรกลย เพอใชเปนเชลลของระบบปฏบตการ BSD Unix (Berkeley Software Distribution) โดยจดใหมโครงสรางควบคมการท างานตลายภาษา C และ Korn shell (ksh) ซงพฒนาขนในชวงตนทศศวรรษ 1980s โดย David Korn แหงหองปฏบตการวจยเบลล โดยใชโปรแกรมตนฉบบของ Bourne shell เปน

Page 8: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

ตนแบบ เพมเตม ปรบปรง และผสมผสานคณลกษณะของ C-shell ตามความตองการของผใชในหองปฏบตการวจยเบลล

หนาทของเชลล ------------

1. ท าหนาทเปนตวแปลค าสง (Command interpreter) โดยแปลบรรทดค าสงทไดรบจากแปนพมพทค าสง ซง "ค าสง" อาจเปน - ค าสงภายในของเชลล (internal command), หรอ - โปรแกรมอรรถประโยชน (utilities) ของระบบปฏบตการ 2. ท าหนาทเปนภาษาระดบสงส าหรบเขยนโปรแกรม (High-level programming language) ท าหนาทอานและประมวลผลค าสงจากแฟมค าสง เรยกวา shell script ซงเชลลจะท าหนาทนไดตองม - ตวแปร ส าหรบเกบขอมล - ค าสงและโปรแกรมอรรถประโยชนส าหรบประมวลผลขอมล - โครงสรางควบคมการท างาน (control flow command)

การเขยนโปรแกรมดวย shell script จดมงหมายของการเขยนโปรแกรม ➤ เขยนโปรแกรมเพอแกปญหา โดยการประมวลผลขอมล ➤ ตองเขาใจปญหา - ตอง "วเคราะหงาน" ตองการ output เปนอะไร -- ตองปอน input อะไร จงจะไดผลลพธเชนนน -- ท าอยางไรจงจะเปลยน input เปน output ได วเคราะห output, วเคราะห input, วเคราะหการประมวลผล (process) ➤ เขยนผงงานหรอค าสงล าลองจากงานทวเคราะหได • ผงงาน (flow chart) นยมใชแสดงภาพโดยรวมของระบบ ⋄ ใชแผนภาพ เหนความตอเนอง ดงาย เขาใจงาย ไมคอยมรายละเอยด • ค าสงล าลอง (pseudocode) แสดงรายละเอยดและขนตอนของการท างาน ⋄ คลายภาษาธรรมชาตทใชในชวตประจ าวน ใช keyword และการยอหนา แสดงโครงสรางการท างาน ⋄ โครงสรางการท างานคลายกบภาษาส าหรบเขยนโปรแกรม เปลยนค าสงล าลองเปนโปรแกรมไดงาย

การแกปญหา คอ การประมวลผลขอมล ตองมทเกบขอมล - ตวแปรชนดตางๆ ตองมการประมวลผล - ตวแปรมชนด หรอ ตวแปรเปนสมาชกของเซต เซตม operator ประจ า เชน

เซตของจ านวนเตม ม บวก, ลบ, คณ, div, mod, ตองมโครงสรางควบคมการท างาน - เรยงล าดบ, มการเลอก, ท าซ า, โปรแกรมยอย, ... ตองมขนตอนวธในการท างาน - algorithm

Page 9: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

การเขยน Shell Script -- การประมวลผลสวนใหญเปนการเรยกใช Utilities (โปรแกรมอรรถประโยชน) ของระบบปฏบตการ ดงนนผทจะเขยน script ไดด นอกจากจะตองมความรในเรองอกขระพเศษ ตวแปร และโครงสรางควบคมการท างานแลว ยงตองศกษาและท าความคนเคยกบ Utilities ทงรปแบบ และ option ตางๆ เพอใหไดผลลพธตามรปแบบทตองการ โดยเฉพาะเมอตองน าค าสงมาตอกนเปน pipeline หรอตองเปลยนทศทางขอมล (redirection)

การเขยน shell script อยางงาย ----------------------------

• ค าสงใดๆทสามารถปอนไดท prompt สามารถใชใน shell script ได รวมทง ambiguous file reference (การใช *, ? และ character class ในชอแฟม), การเปลยนทศทาง input/output และการท าน าค าสงมา ตอกนเปน pipeline

• สามารถใชค าสงควบคมการท างาน (Control flow) สรางทางเลอก การท าซ า ฯลฯ

• เชลลจะอานค าสงจากแฟม ขยายความหมายของอกขระพเศษ และท างานไปทละค าสง ตามล าดบทอานได

• shell script (ซงเปนแฟมค าสงของเชลล) ผใชตองมสทธ read และ execute read - เพอใหสามารถเปดแฟม และอานขอมลในแฟมได execute - เพอใหสามารถท างานตามค าสงทอานจากแฟมได ค าสงอยางงายส าหรบ "เพม" สทธในการ execute (x) ใหแกเจาของแฟม หรอ user (u) $ chmod u+x ชอแฟม shell script

• ในกรณทตองการให bash ท าหนาเปนตวแปลภาษาระดบสงท าได 2 แบบ ⋄ $ bash ชอแฟม shell script ⋄ ขนตนแฟม shell script (บรรทดแรกและคอลมนแรก) ดวย

#!/bin/bash

⋄ เครองหมาย #! มชอเรยกเฉพาะวา shebang ตามดวย absolute pathname ของเชลลทตองการ ⋄ เครองหมาย #! (# - hash, ! - bang) จะมผลในการเลอกเชลลเฉพาะเมอเรมตนท row = 0, col =0

หากอยทต าแนงอน # แทนจดเรมตนของ comment และส าหรบ comment "Comments make shell scripts and all codes easier to read

and maintain by 'you' and 'other'."

"หมายเหตชวยให shell scripts และโปรแกรมภาษาอนๆ อานและปรบปรงแกไขไดงาย ทงผเขยนเองและผอน"

ตวแปรของ shell --------------

Page 10: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

- shell script สามารถใชงานตวแปรไดเชนเดยวกบภาษาส าหรบเขยนโปรแกรมโดยทวไป ตวแปรของ shell ไมมการก าหนดชนด

- ใชเกบ จ านวน, อกขระ, หรอ สายอกขระ การสรางตวแปรจะเกดขนโดยอตโนมตเมอมการก าหนดคาใหกบชอตามรปแบบ

name=value # หรอ ชอตวแปร=คา

เปนการสรางและก าหนดคา โดยไมจ าเปนตองมการประกาศตวแปรกอน เชน ในตวแปลภาษาในกลม Compiler ทงนเพราะ shell เปนตวแปลภาษาชนด Interpreter

ตวอยางท 1 : "Hello World!" โดยใชตวแปร --------------------------------------

$ cat -n hello.sh

1 #!/bin/bash

2 STR="Hello World!"

3 echo $STR

::: อธบายการท างานของโปรแกรม :::

✦ บรรทดท 1: #!/bin/bash

ก าหนดให shell ทท าหนาทเปนตวแปลภาษาเปน Bourne Again Shell หรอ bash ซงเปนแฟมโปรแกรมใน /bin และบรรทดนท าใหระบบมองเหนแฟมนเปน Shell Script เมอตรวจสอบดวยค าสง file ซงใชส าหรบตรวจสอบ ชนดของแฟม เชน

$ file hello.sh

hello.sh: Bourne-Again shell script, ASCII text executable

หมายความวา hello.sh เปน Shell script ของ Bourne-Again Shell (bash) เนอหาของแฟมเปน text file ชนดสามารถท างานได หากตดบรรทดท 1 ออก ค าสง file จะรายงานผลดงน

$ file hello.sh

hello: ASCII text

หมายวา hello.sh เปน text file ตามปกต อยางไรกดแฟม Script ทสรางขนไมวาระบบจะมองเหนเปน text file ธรรมดา หรอ shell script ผใชยงไมสามารถสงใหท างานได เพราะยงไมไดก าหนดใหแฟมนมสทธ execute เชน

$ hello.sh

-bash: ./hello.sh: Permission denied # ไมมสทธสงใหท างาน $ chmod 700 hello.sh # เปลยน mode ของแฟมเปน -rwx------ $ hello.sh # ท างานได Hello World!

Page 11: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

การหาเสนทางไปยงแฟมโปรแกรม bash ท าไดโดยใชค าสง which เชน

$ which bash

/bin/bash

หมายเหต: แฟม shell script ไมจ าเปนตองมสวนขยาย แตในทางปฏบตนยมก าหนดใหมสวนขยายเปน .sh

✦ บรรทดท 2: STR="Hello World!"

เปนการก าหนดสายอกขระ "Hello World!" ใหกบตวแปร STR มรปแบบทวไปเปน

ชอตวแปร=คา

ระหวางชอตวแปรและเครองหมาย = และระหวางเครองหมาย = และคา ตองไมมวรรค

$ STR ="Hello World!" # วรรคระหวางชอตวแปร และ =, ระบบจะเขาใจวา STR เปนค าสง STR: command not found # รายงานวาไมพบค าสง STR

$ STR= "Hello World!" # วรรคระหวาง = และคา, STR= เปนการยกเลกคาของตวแปร STR Hello World!: command not found # และเขาใจวา "Hello World!" เปนค าสง จงรายงานวาไมพบค าสงน

ในบรรทดค าสง whitespace ใชเปนตวแยก argument ออกจากกน คามรปแบบ ค าสง argument-list

✦ บรรทดท 3: echo $STR

อานคาทเกบในตวแปร STR มาใชเปน argument ใหกบค าสง echo ตองใชเครองหมาย $ น าหนาชอตวแปร

ค าสง $ชอตวแปร

ในกรณทลมใชเครองหมาย $ เชน

$ echo STR

ยงคงเปนค าสงทถกตอง เนองจากค าสง echo จะตความวา STR เปนสายอกขระทตองการใหพมพออกทาง standard output จงไดผลลพธเปน STR

ตวอยางท 2 ทจะกลาวถงคอไปมการใชงาน tar (tape archive) จงตองเรมจากรายละเอยดของค าสงนกอน

ค าสง tar -------

ค าสง tar เปนค ายอมาจาก tape archive หรอการส ารองขอมลในจานแมเหลกดวยเทปแมเหลก ซงจะตองเปลยนโครงสรางแบบตนไมของระบบแฟมในจานแมเหลกเปนโครงสรางแบบเรยงล าดบในเทป และสามารถเปลยนกลบมาไดถกตอง

Page 12: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

เหมอนเดม เมอมการเรยกคนระบบแฟมสสภาพเดม (restore) ในปจจบนนอกจากจะใชในการรวมแฟมเพอส ารองขอมลแลว ยงใชรวมแฟมเพอสงผานเครอขาย หรอบนทกลงในสอเพอน าไปตดตงในเครองปลายทาง ค าสง tar เปนค าสงตามมาตรฐาน POSIX

รปแบบการใชงาน tar [-ตวเลอก] ชอแฟมรวมไฟล(.tar) ชอไดเรกทอรทตองรวมแฟม

ตวเลอกทมการใชงานบอยๆ เชน -c (create) - สรางแฟมรวมไฟล หรอสราง archive ใหม -x (extract) : แยกแฟมออกจาก archive -v (verbose) : แสดงชอแฟมทก าลงด าเนนการ -f (filename) : ก าหนดชอแฟมรวมไฟล (archive) และก าหนดใหเครองหมาย dash (-) ใชแทน stdin และ stdout

การสรางแฟมรวมไฟล หรอ tar file

$ tar -cvf ชอแฟมรวมไฟล ชอไดเรกทอร

การแยกแฟมออกจาก tar file

$ tar -xvf ชอแฟมรวมไฟล ชอไดเรกทอร

ในปจจบนมการใชงาน tar ในการรวมแฟมทงหมดทตองการเปน tar file หรอ tar archive (หรอนยมเรยกกนเลนๆ วา tar ball) เพอความสะดวกในการน าไปตดตงในเครองอน หรอรวมเปนแฟมไวเพอความสะดวกในการ download นอกจากนยงสามารถใชงานรวมกบโปรแกรมบบอดขอมลเพอลดขนาดของ tar file ดวย โดยก าหนดตวเลอก -z เพอบบอดหรอคลายขอมลดวยโปรแกรม gzip และ gunzip แฟมทมการบบอดไปพรอมกบการสราง tar file นยมก าหนดใหมสวนขยายเปน .tgz เพอแสดงวาเปน tar file ทมการบบอดขอมลดวย gzip และหากมการสรางแฟม tar file (*.tar) เสรจแลว จากนนจงเรยกใชโปรแกรม gzip บบอด tar file จะก าหนดสวนขยายเปน *.tar.gz

ตวอยางท 2: การส ารองขอมลอยางงาย -------------------------------

$ cat -n backup.sh

1 #!/bin/bash

2 OF=jira-backup-$(date +%Y%m%d).tgz

3 tar -czvf $OF ./tmp

backup.sh เปนโปรแกรมส าหรบท าการ backup ขอมลในไดเรกทอรทก าหนด (ในโปรแกรมนคอ ./tmp) เปนแฟม archive

โดยใชโปรแกรม tar องคประกอบส าคญของชอแฟมคอวนเดอนปทด าเนนการ วธการนใชไดหากมการส ารองขอมลไมเกน วนละ 1 ครง

::: อธบายการท างานของโปรแกรม :::

Page 13: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

✦ บรรทดท 2: OF=jira-backup-$(date +%Y%m%d).tgz

ก าหนดใหตวแปร OF เกบชอแฟม ซงมสองสวนคอ ก. คาคงท string ซงแลวแตผใชจะก าหนด ในโปรแกรมนคอ "jira-backup-" และตอดวย ข. วนเดอนปปจจบนในรป yyyymmdd เพอสะดวกในการเรยงชอแฟมตามล าดบการส ารองขอมล วนเดอนปปจจบน หาไดโดยใชค าสง date ซงใชแสดงวนเวลาของระบบ และหากเปนผดและระบบ (superuser) สามารถตงเวลาของระบบไดมรปแบบการใชงานดงน

date [-option] [+format]

สงเกตการใชเครองหมาย + ในการก าหนด format ใหแตกตางจาก option

การแสดงผลสามารถจดไดหลายรปแบบ โดยมเครองหมาย % น าหนาอกษรแสดงรปแบบ (แบบเดยวกบ format ของ printf) format ของค าสง date มหลายรปแบบ เฉพาะทใชในงานนไดแก

%Y แสดงป ค.ศ. เปนเลขสหลก หากใช %y จะแสดงเฉพาะสองหลกสดทาย %m แสดงหมายเลขเดอนเปนตวเลขสองหลก %d แสดงวนทเปนตวเลขสองหลก

ดงนนวนเดอนปปจจบนในรป yyyymmdd จงตองก าหนดรปแบบเปน %Y%m%d เมอน าไปใชในค าสง date ตองน าหนาดวย + เพอแสดงวาเปน format เมอไดวนเดอนปแลวตองน ามาตอกบสายอกขระทก าหนด จงตองแทนทค าสง date ดวยผลลพธ หรอ ท า command substitution โดยใช $(...) หรอ `...` (back tick หรอ back quote) เพอน าไปใชในการก าหนดคาใหตวแปร OF (เกบชอของ Output File)

✦ บรรทดท 3: tar -czvf $OF ./tmp

ท าการรวมแฟมในไดเรกทอรยอย tmp พรอมบบอดเขาเปน tar file โดยก าหนดใหชอแฟมเปนไปตามคาทก าหนดไวในตวแปร OF

ตวแปร STR ในตวอยางท 1 และตวแปร OF ในตวอยางท 2 เปนตวแปรทมการสรางขนใชงานในระหวางท script ท างาน เมอท างานเสรจจะถกท าลายไป ทดสอบได โดยใชค าสง "echo $ชอตวแปร" หลงจาก shell script ท างานเสรจแลว ซงจะไมมการแสดงคาใด แสดงวาไมม ตวแปรนนนสงแวดลอม ความเปนจรงทางเทคนคคอ เมอผใชเรยกให shell script ท างาน, shell ปจจบนจะท าการสรางโพรเซสลก และก าหนดใหโพรเซสลกท างานตามค าสงใน shell script นน เมอท างานเสรจ โพรเซสลกจะสลายตวไป ท าใหตวแปรทงหมดทโพรเซสลกสรางขนจะถกท าลายไปดวย

ตวอยางท 3: ตวแปรเฉพาะถน (Local variables) ------------------------------------------

Shell script สามารถมโปรแกรมยอยไดเชนเดยวกบโปรแกรมทวไป และสามารถก าหนดใหตวแปรของโปรแกรมยอยนนเปนตวแปรเฉพาะถนไดโดยใชค าส าคญ local เชน

$ cat -n ocalvar.sh

1 #!/bin/bash

Page 14: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

2 HELLO=Hello

3 function hello

4 {

5 local HELLO=World

6 echo $HELLO

7 }

8 echo $HELLO

9 hello

10 echo $HELLO

-- Script นแสดง "แนวคด" หลายอยาง -- 1. การประกาศและการก าหนดรายละเอยดของฟงกชน hello ในบรรทดท 4 - 7 2. การประกาศตวแปร HELLO เปนตวแปร local ในฟงกชน hello ซงมชอพองกบตวแปร global แตก าหนดคาตางกน 3. ความสบสนระหวางชอ identifier และคาคงท - HELLO เปนชอตวแปร ทงตวแปร global และตวแปร local - hello เปนชอโปรแกรมยอย - Hello เปนคาคงทสายอกขระ น ามาใชในการก าหนดคาโดยตรง ไมได quote ดวย single หรอ double quote และไมมความจ าเปนทจะตอง quote เพราะไมอกขระพเศษของ shell

การตงชอในลกษณะนไมมปญหาใดตอตวแปลภาษาของ shell เพราะเปนการจ าแนกโดยใชต าแหนงทางไวยกรณ แตจะมปญหาตอผเขยนโปรแกรม จงเปนสงทไมควรท า แตไมสามารถหามผอนท าได เมอจ าเปนตองอานโปรแกรมลกษณะนตองท าตวใหเหมอนตวแปลภาษา เชน

HELLO=Hello

เครองหมาย = หรอ assignment operator ใชในการก าหนดคาใหกบตวแปร ดานซายมอจงเปนชอของตวแปร ดานขวามอเปนคาทสตรงทใชก าหนดใหกบตวแปร, ส าหรบ hello เปนฟงกชนทชดเจนมาก อนงโปรแกรมลกษณะ comment ทดจ าเปนมาก เชน

1 #!/bin/bash

2 HELLO=Hello # สรางและก าหนดคาตวแปร global 3 function hello # บรรทดท 3 - 7: ก าหนดรายละเอยดการท างานของฟงกชน hello 4 {

5 local HELLO=World # สรางและก าหนดคาตวแปร local ซงมชอพองกบตวแปร global 6 echo $HELLO

7 }

8

9 echo $HELLO # การท างานจรงของโปรแกรม แสดงคาของตวแปร global

10 hello # เรยกใชงานฟงกชน hello เพอแสดงคาของตวแปร local 11 echo $HELLO # แสดงคาของตวแปร global อกครงหนง

Page 15: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

Command Line Arguments และตวแปรพเศษ

-----------------------------------

รปแบบทวไปของโปรแกรมอรรถประโยชน (Utilities) ของ Unix

ค าสง [-option] argument-list +------------------------+

+ command line argument ชองทางสอสารระหวางผใชและโปรแกรม

ตวอยาง: บรรทดค าสงแสดงชอแฟมภาษา C ทงหมด (แฟมโปรแกรม และ header file) ในไดเรกทอรปจจบน

$ ls -l *.c *.h

องคประกอบ ls -l *.c *.h เปน บรรทดค าสง (command line) ls เปนค าสง (command) -l *.c *.h เปน argument ของบรรทดค าสง (command line argument) ม 3 ชด แตละชดคนดวยเครองหมายวรรคตอน

การอางองถงองคประกอบของบรรทดค าสง ใชตวแปรพเศษ เรยกวา positional parameter ก าหนดล าดบดงน ls -l *.c *.h $0 $1 $2 $3

argument ทงหมดของบรรทดค าสงแทนดวย $@ หรอ $* (แทน "-l *.c *.h" ในตวอยาง) จ านวนของ argument ทงหมด $# (ไมรวมค าสง)

shell script สาธตการท างานของ Positional parameter

$ cat -n args.sh

1 #!/bin/bash

2

3 i=0

4 n=1

5 argv=("$@")

6

7 echo 'argument count, $# = ' $#

8 echo argument values:

9 while [ $i -lt $# ]; do

10 echo \$$n = ${argv[$i]}

11 i=$(($i + 1))

12 n=$(expr $n + 1)

13 done

ผลการท างานของ Script --------------------

$ args.sh xx yy zz

argument count, $# = 3

Page 16: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

argument values:

$1 = xx

$2 = yy

$3 = zz

รำยละเอยดของ shell script: args.sh

----------------------------------

โครงของโปรแกรมแบงออกเปน 3 ตอนคอ - header ของ bash shell script (บรรทดท 1) - การสรางและการก าหนดคาเรมตนของตวแปร (บรรทดท 3 - 6) - การประมวลผลของโปรแกรม (บรรทดท 7 - 13) - พมพจ านวนของ argument ทไดรบ และบรรทดหวเรอง - โครงสรางท าซ าชนด while ส าหรบพมพคาของ argument ทไดรบจนครบทกตว

กำรสรำงและกำรก ำหนดคำเรมตนของตวแปร --------------------------------

3 i=0

4 n=1

5 argv=("$@")

การสรางและก าหนดคาของตวแปร i และ n เปนไปตามรปแบบปกต ส าหรบบรรทดท 5 เปนการน าคาของ arguments ทงหมดทไดรบ (ตวแปร $@ - เฉพาะ argument จรง ไมรวมค าสง) มาก าหนดใหกบตวแปร argv - คาของ $@ อาจเปนคาวาง, มคาเดยว, หรอ อาจมไดหลายคา (zero or more) การแสดงวาคาทน ามาก าหนดใหกบตวแปร ท าไดโดยการก าหนดคานนไวในวงเลบ และเพอปองกน shell ขยายคาอกขระพเศษ ทอาจม จง quote ดวย double quote - เมอคาทางขวามอมหลายคา argv จงตองเปนตวแปรทสามารถเกบคาไดหลายคา (เปน array) โดยเกบคาแรกใน argv[0],

คาทสองใน argv[1], ...

--> argv=("S@") จงเปนน า argument มาสรางเปน array ของ argument นนเอง

โครงสรางท าซ าชนด while ----------------------

9 while [ $i -lt $# ]; do

10 echo \$$n = ${argv[$i]}

11 i=$(($i + 1))

12 n=$(expr $n + 1)

13 done

รปแบบทวไปของโครงสรางท าซ าแบบ while while [ นพจนเปรยบเทยบ ]; do while [ นพจนเปรยบเทยบ ] ... ค าสงประมวลผลใน loop ... do

done ... ค าสงประมวลผลใน loop ... done

Page 17: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

9 while [ $i -le $# ]; do

[ ... ] เปนรปยอของค าสง test ส าหรบ "ทดสอบ" นพจน ใหผลลพธเปนคาความจรง "นพจน" มหลายแบบ เชน นพจนเปรยบเทยบ และ นพจนส าหรบทดสอบแฟม เปนตน นพจนเปรยบเทยบ แยกเปน - เปรยบเทยบสายอกขระ; =, != # เทา หรอ ไมเทา - เปรยบเทยบจ านวนเตม; eq, ne, gt, ge, lt, le # เฉพาะกรณทแนใจวาคาของตวแปรเปนตวเลข [ $i -le $# ] คาของตวแปร i <= จ านวนของ arguments

10 echo \$$n = ${argv[$(echo $i)]}

ตองการแสดงผลเชน $1 = คาของ rgument ตวแรก , $2 = คาของ rgument ตวแรก, ... พมพเครองหมาย $ ซงเปนอกขระพเศษ จงตอง quote ดวย \$, หากไม quote จะได $$ ซงเปนตวแปรพเศษเกบ หมายเลขโพรเซส (process id - pid) พมพตวเลขซงเปนคาของตวแปร n (เรมจาก 1) ตามดวย = ;e cho \$$n = --> ไดผลลพธเปน $1 = พมพคาของ argument ตวแรก ซงเปนสมาชกล าดบท 0 ของ argv ซงเปน array - การเขาถงสมาชกของ array มรปแบบทวไปเปน -- ${ชอ-array[ดชน]} คาของดชนคอในโปรแกรมนคอคาของตวแปร i -- ${argv[$i]}

บรรทดท 11 - 12 การเพมคาของตวแปร แสดงวธการทนยมใช 2 แบบ ซงมการท างานเทยบเทากน 11 i=$(($i + 1))

เนองจากคาของตวแปร i ในโปรแกรมเปนจ านวนเตม จงสามารถน ามาใชในนพจนคณคศาสตรได และค านวณคาของนพจน โดยใช $((...)) -- วงเลบสองชน คอ ค านวณคานพจนคณตศาสตร เปนค าสงทมใน shell รนใหม

12 n=$(expr $n + 1)

ใชค าสง expr ส าหรบหาคาของนพจนคณตศาสตร และน าผลลพธของ expr ไปก าหนดใหตวแปร โดยใช $() -- วงเลบชนเดยว คอ command substitution

ตวอยาง : การใชงาน Command Line Argument

--------------------------------------

โปรแกรม backup.sh ส าหรบการส ารองขอมลอยางงายทผานมา จ ากดการใชงานไวเฉพาะผใช jira และก าหนดไดเรกทอรไว ตายตวคอ ./tmp ซงหากเปนโปรแกรมซงมผใชงานคนเดยวและส ารองขอมลในไดเรกทอรทก าหนดเสมอ อาจไมมปญหาใด แต หากผใชตองการเปลยนไดเรกทอรทจะส ารองขอมลตองแกโปรแกรมใหม หรอหาตองการตดตงไวเปนโปรแกรมสวนกลางส าหรบ ผใชงานทกคนในระบบ ตองปรบปรงใหสามารถรบชอผใชและไดเรกทอรทตองการได ผานทาง command line argument

ผใชเรยกโปรแกรม backup.sh และก าหนด ชอผใช และ ไดรกทอรทตองการส ารองขอมล ดงน

$ backup ชอผใช ชอไดเรกทอร

Page 18: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

โปรแกรม backup.sh ทดดแปลงแลว เปนดงน

$ cat -n backup.sh

1 #!/bin/bash

2 OF=$1-backup-$(date +%Y-%m-%d).tgz # ใชตวแปร $1 เปนสวนหนงของชอแฟม 3 tar -czvf $OF $2 # ใชตวแปร $2 เปนชอไดเรกทอร

ตวอยางการท างาน ผใช somchai ตองการส ารองขอมลในไดเรกทอร MyProject ใชค าสงดงน

$ backup somchai MyProject

โปรแกรมจะท าการรวมแฟมทงหมดในไดเรกทอร MyProject และบบอดเปน archive file ชอ somchai-backup-2016-03-17.tgz

ปญหาของโปรแกรมทรบขอมลผาน command line argument คอ หากผใชเรยกใชงานเฉพาะค าสง โดยไมม argument จะเกด ความผดพลาดในการท างานจาก Utilities ทเรยกใช เชน

$ backup2.sh

tar: Cowardly refusing to create an empty archive # tar ไมกลาทจะสรางแฟม archive วาง Try 'tar --help' or 'tar --usage' for more information. # ใช tar --help เพอดวธการใชงาน

เนองจากเปน error ทเกดขนจากโปรแกรม tar ท script เรยกใช จงเปน error ทไมสามารถแกไขได แต สามารถปองกนได โดยการตรวจสอบ command line argument ใหดทสดเทาทจะท าได ทงจ านวน และ ความสมเหตสมผลของ argument ซง ตองใชโครงสรางแบบมการเลอก และอาจตองใชโครงสรางแบบท าซ าเขาชวย

การเขยน script เปนแบบฝกหดทดในการท าหดท า error handling ซงเปนองคประกอบทส าคญส าหรบการเขยนโปรแกรมเปน อาชพ

ตวอยางการใช ( ) จดกลมค าสง ------------------------

shell script ตอไปนใชค าสง tar (tape archive) ในการคดลอกแฟมทงหมดจากไดเรกทอรหนงไปยงอกไดเรกทอรหนงScript ส าหรบคดลอกแฟมทงหมดจากไดเรกทอรหนงไปยงอกไดเรกทอรหนง

$ cat cpdir

Page 19: Lecture09 - สัปดาห์แรกหลังสอบกลางภาคnutthanon/88624159/Lect09.pdf · Lecture09 - สัปดาห์แรกหลังสอบกลางภาค

( cd $1 ; tar -cf - . ) | ( cd $2 ; tar -xvf - . )

ถาตองการคดลอกแฟมทงหมดจาก ~/886326/week04 ไปยง ~/886326/temp เรยกใชดวย

$ cpdir ~/886326/week04 ~/886326/temp

ขอมลทจ าเปน $1 และ $2 เปนตวแปรระบบ ซงเชลลจะผาน argument ทไดรบจากบรรทดค าสงเขาไปยง shell script กลาวอกนยหนงคอ $1 และ $2 เปน positional parameters นนเอง

$ cpdir ~/886326/week04 ~/886326/temp

-------------- -------------

$1 $2

เมอแทนคาตวแปรใน cpdir จะได

( cd ~/886326/week04 ; tar -cf - . ) | ( cd ~/886326/temp ;

tar -xvf - .)

เมอ script ท างาน จะแยกการท างานออกเปนสอง subshell ค าสงในแตละวงเลบจะท างานใน subshell ของตนเอง

วงเลบแรก แทนค าสงกลมแรก ไดแกการเปลยนไดเรกทอรไปยง ~/886326/week04 จากนนจงท าการรวมแฟมทงหมดในไดเรกทอรปจจบนเปน archive สงออกทาง pipe

วงเลบทสองคอแทนค าสงกลมทสอง ไดแกการเปลยนไดเรกทอรไปยง ~/886326/temp จากนนจงอาน archive จาก pipe แลวจงแตกแฟมทงหมดออกจาก archive เกบลงในไดเรกทอรปจจบน